activité de démarrage android à partir du service

151

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 depuis Activity

Dans le Activitycas état satisfait commence

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

de mon LocationServicementionné ci-dessus n'a pas pu démarrer Activity, comment puis-je obtenir le contexte de l'exécution actuelle Activitydans la classe de service?

d-man
la source

Réponses:

344

Depuis l'intérieur de la classe Service:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
d-man
la source
17
Seule la FLAG_ACTIVITY_NEW_TASK est nécessaire car seules les activités peuvent démarrer des activités sans elle. 'this' peut être utilisé à la place de getBaseContext et getApplication puisque le service a son propre contexte.
Sojurn
1
Comment supprimer par programme cette activité de la liste d'écran récente?
Prashanth Debbadwar
2
Ne fonctionne pas si le service est en arrière-plan. Une solution à cela?
Rick Royd Aban
4
S'il vous plaît, aidez-moi pour une application ouverte du service d'arrière-plan J'ai utilisé le service Firebase (FCM). Je veux ouvrir l'écran de mon interface utilisateur d'appel à partir de mon application, alors s'il vous plaît, aidez-moi pour cela
Dipanki Jadav
2
J'ai écrit votre code dans mon service lorsque l'application est en arrière-plan, et je vois que le service fonctionnait sur xiaomi mi a2, mais ne fonctionnait pas sur xiaomi redmi note 7, pouvez-vous expliquer pourquoi il fonctionne sur un appareil et l'autre pas?
Amjad Omari
18

J'ai eu le même problème et je tiens à vous faire savoir qu'aucune des solutions ci-dessus n'a fonctionné pour moi. Ce qui a fonctionné pour moi était:

 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.

Andy
la source
5
vous stockez le service dans un champ statique, ce qui pourrait entraîner une fuite de mémoire
Murmel
1
startActivity est le même this.startActivity! vous créez une instance inutile à partir de votre service avec une startActivity normale égale, pourquoi?
Amir Hossein Ghasemi
8

Une autre chose à mentionner: alors que la réponse ci-dessus fonctionne très bien lorsque notre tâche est en arrière-plan, la seule façon de la faire fonctionner si notre tâche (faite de service + quelques activités) était au premier plan (c'est-à-dire qu'une de nos activités est 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 d'une utilité réelle ici. La clé du succès était

storedActivity.startActivity(intent);

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

kellogs
la source
1
Cela ne fonctionne pas. Tout cela me donne l'erreur "L'appel de startActivity () depuis l'extérieur d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez?"
Cerin
2
Cela est dû au fait que le deuxième appel à setFlags remplace le premier. Cette solution doit utiliser addFlags, ou un seul appel pour définir des indicateurs qui transmettent Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac
8
Vous ne souhaitez pas combiner des indicateurs avec &&; vous voulez utiliser | (une seule mesure pour ou au niveau du bit)
Jon Watte
Intent intent = new Intent (storedActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); stockéActivity.startActivity (intention);
Prakhar1001
1

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

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);
Martin Zeitler
la source
Je pense que cela fonctionne uniquement avec le FLAG_ACTIVITY_NEW_TASKdrapeau
Cerlin
0

Alternativement,

Vous pouvez utiliser votre propre classe Application et appeler où que vous soyez (en particulier les non-activités).

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();
James
la source
2
Prenez soin d'utiliser une instance statique du contexte, cela peut entraîner plusieurs fuites de
mémoire
1
@crgarridos Non. Il s'agit d'un contexte d'application qui est Singleton de par sa nature et qui ne conduira pas à des fuites de mémoire
GV_FiQst
1
Je changerais la ligne context = getApplicationContext();encontext = this;
GV_FiQst
-1

Si vous avez besoin de recalculer une activité qui est en bacgrounde, de votre service, je vous suggère le lien suivant. Intent.FLAG_ACTIVITY_NEW_TASK n'est pas la solution.

https://stackoverflow.com/a/8759867/1127429

GMG
la source