129 votes

Comment vérifier si une activité est la dernière de la pile d'activités d'une application ?

Je veux savoir si l'utilisateur revient à l'écran d'accueil s'il quitte l'activité en cours.

1 votes

45 votes

Je viens de découvrir qu'il existe une fonction dans Activity appelée isTaskRoot qui, je suppose, peut vous aider.

179voto

raukodraug Points 3280

Je vais poster le commentaire de @H9kDroid comme la meilleure réponse ici pour les personnes qui ont une question similaire.

Vous pouvez utiliser isTaskRoot() pour savoir si l'activité est le Racine d'une tâche.

J'espère que cela vous aidera

1 votes

Pouvez-vous s'il vous plaît fournir la seule ligne de code afin que la façon d'utiliser isTaskRoot soit claire. Merci.

20 votes

@TheHunter if (isTaskRoot()) { // do something }

3 votes

Le seul problème est que dans la version <=4.4, le comportement est différent de celui de la version >= 5.x. Il semble toujours renvoyer false.

119voto

sandrstar Points 5237

MISE À JOUR (juillet 2015) :

Depuis getRunningTasks() sont dépréciées, à partir de l'API 21, il est préférable de suivre les règles suivantes raukodraug responder o Ed Burnette un (Je préférerais le deuxième).

Il est possible de vérifier les tâches en cours et leur pile à l'aide de la fonction ActivityManager .

Donc, pour déterminer si une activité est la dernière :

  • demander les permissions Android.permission.GET_TASKS dans le manifeste.
  • Utilisez le code suivant :

    ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
    
    List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
    
    if(taskList.get(0).numActivities == 1 &&
       taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
        Log.i(TAG, "This is last activity in the stack");
    }

Veuillez noter que le code ci-dessus ne sera valable que si vous avez une seule tâche. S'il est possible qu'il y ait un certain nombre de tâches pour votre application, vous devrez vérifier d'autres codes d'accès. liste des tâches éléments. En savoir plus sur les tâches Tâches et pile arrière

26 votes

H9kDroid a fait une suggestion correcte. La réponse choisie est un hack. Il faut le faire de la bonne façon en utilisant le isTaskRoot() méthode.

0 votes

@Sufian où est-ce qu'il pirate particulièrement ? Le code est logique et utilise les API Android ouvertes de la manière dont elles sont censées être utilisées (par exemple, getRunningTasks devrait être utilisé pour obtenir les tâches en cours d'exécution et on pourrait vouloir l'appeler uniquement dans le but d'analyser ces tâches). L'utilisation de get(0) est bien documentée et logique : "Retourne une liste des tâches en cours d'exécution, la plus récente en premier et les plus anciennes après dans l'ordre".

2 votes

GetRunningTasks() est déprécié au niveau 21 de l'API.

5voto

Ed Burnette Points 1017

Bien qu'il existe peut-être un moyen d'y parvenir (voir les autres réponses), je pense que vous ne devriez pas le faire. Les applications Android normales ne devraient pas avoir besoin de savoir si l'écran d'accueil est sur le point de s'afficher ou non.

Si vous essayez de sauvegarder des données, placez le code de sauvegarde des données dans votre méthode onPause(). Si vous essayez de donner à l'utilisateur un moyen de changer d'avis sur l'existence de l'application, vous pourriez intercepter la touche haut/bas de la touche Retour et la méthode onBackPressed() et lui présenter une invite "Êtes-vous sûr ?

1 votes

Et si j'ai besoin qu'un service fonctionne tant que l'utilisateur n'a pas quitté l'activité ? Je ne peux pas piéger les fonctions comme onStop car elles pourraient être appelées après l'extinction de l'écran.

2 votes

Si un service d'arrière-plan lance une activité, vous aimeriez peut-être savoir si c'est la seule activité de la pile ou non.

5voto

H9kDroid Points 1290

Une façon d'en garder la trace est d'inclure un marqueur lorsque vous démarrez une nouvelle activité et de vérifier si le marqueur existe.

Chaque fois que vous commencez une nouvelle activité, insérez le marqueur :

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);

Et vous pouvez alors le vérifier comme ceci :

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")

1 votes

Cela ne fonctionne pas si l'activité est tuée et que la pile d'activités est reconstruite - chaque activité par demande.

2voto

A. Binzxxxxxx Points 205

Le problème avec la solution de sandrstar utilisant ActivityManager c'est que vous avez besoin d'une autorisation pour obtenir les tâches de cette façon. J'ai trouvé une meilleure solution :

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

El Activity en bas de la pile devrait toujours obtenir cette catégorie par défaut, tandis que les autres activités ne devraient pas l'obtenir.
Mais même si cela échoue sur certains appareils, vous pouvez le régler en démarrant votre Activity :

Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);

0 votes

Que se passe-t-il si l'activité est ouverte à partir d'une notification push ? Ils n'ont pas la CATEGORIE LAUNCHER

0 votes

Je suis certain que la deuxième partie de ma réponse est toujours valable. Vous pouvez définir la catégorie comme une indication dans l'intention. Dans ce cas, peut-être dans l'intention de votre contexte de notification. Sinon, vous pouvez aussi utiliser des drapeaux pour cela. Consultez ce lien pour la création d'une notification avec intention : stackoverflow.com/questions/13716723/

0 votes

Néanmoins, si votre activité la plus ancienne est MainActivity et qu'elle est maintenant reprise, que vous recevez une notification push et que vous définissez le pendingIntent pour ouvrir avec CATEGORY_LAUNCHER, alors vous aurez 2 activités avec cette catégorie. Probablement sur des tâches différentes cependant

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X