web-dev-qa-db-fra.com

android démarrer l'activité depuis le service

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

J'ai lancé ce service de Activity

Dans Activity si la condition vérifie le début

startService(new Intent(WozzonActivity.this, LocationService.class));

de mon LocationService mentionné ci-dessus ne pouvait pas lancer Activity, comment puis-je obtenir le contexte de la version en cours d'exécution Activity dans la classe de service?

131
d-man

Depuis la classe de service:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
318
d-man

J'ai eu le même problème et je tiens à vous faire savoir qu'aucune de ces solutions ne fonctionnait pour moi. Ce qui a fonctionné pour moi a été:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

et dans l'une de mes sous-classes, stockées dans un fichier séparé, je devais:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

Toutes les autres réponses m'ont donné un nullpointerexception.

17
Andy

Une autre chose à noter: bien que la réponse ci-dessus fonctionne très bien lorsque notre tâche est en arrière-plan, la seule façon de le faire fonctionner si notre tâche (constituée de service + quelques activités) était au premier plan (c’est-à-dire une de nos activités visible). à l'utilisateur) était comme ceci:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

Je ne sais pas si ACTION_VIEW ou FLAG_ACTIVITY_NEW_TASK sont réellement utiles ici. La clé pour réussir était

storedActivity.startActivity(intent);

et bien sûr FLAG_ACTIVITY_REORDER_TO_FRONT pour ne pas instancier l'activité à nouveau. Bonne chance!

8
kellogs

on ne peut pas utiliser le Context du Service; a pu obtenir le (package) Context de la même manière:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);
1
Martin Zeitler

Alternativement,

Vous pouvez utiliser votre propre classe d'applications et appeler de n'importe où (en particulier des activités non-actives).

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

Et enregistrez votre classe d'application:

<application Android:name="yourpackage.App" ...

Puis appelez:

App.getContext();
0
james