Comment vérifier si une activité est la dernière de la stack d’activités pour une application?

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

MISE À JOUR (juillet 2015):

Comme getRunningTasks () est obsolète, il est préférable de suivre la réponse de raukodraug ou celle de Ed Burnette (je préférerais la deuxième).

Il est possible de vérifier les tâches en cours et leur stack en utilisant 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 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 valide que si vous avez une tâche unique. S’il y a une possibilité que le nombre de tâches existe pour votre application – Vous devrez vérifier d’autres éléments de taskList . En savoir plus sur les tâches Tâches et Back Stack

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

Vous pouvez utiliser isTaskRoot () pour savoir si l’activité est la racine d’une tâche.

J’espère que ça aide

il existe une solution la plus simple, vous pouvez utiliser isTaskRoot () dans votre activité

Bien qu’il y ait peut-être un moyen d’y parvenir (voir les autres réponses), je vous suggère de ne pas le faire. Les applications Android normales ne devraient pas avoir besoin de savoir si l’écran d’accueil est sur le sharepoint s’afficher ou non.

Si vous essayez d’enregistrer des données, placez le code d’enregistrement 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 pouvez intercepter la clé haut / bas pour la clé Back et la méthode onBackPressed () et leur présenter un “Êtes-vous sûr?” rapide.

Une façon de suivre cela consiste à inclure un marqueur lorsque vous commencez une nouvelle activité et vérifiez 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") 

Le problème avec la solution de sandrstar utilisant ActivityManager est la suivante: vous avez besoin d’une autorisation pour obtenir les tâches de cette manière. J’ai trouvé un meilleur moyen:

 getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) 

L’ Activity sur le fond de la stack devrait toujours avoir cette catégorie par défaut alors que les autres activités ne devraient pas l’obtenir.
Mais même si cela échoue sur certains appareils, vous pouvez le définir lors du démarrage de votre Activity :

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

J’ai créé une classe de base pour toutes mes activités, étendant AppCompatActivity et disposant d’un compteur statique:

 public abstract class BasicActivity extends AppCompatActivity { private static int activityCounter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ++activityCounter; ... } @Override public void onDestroy() { super.onDestroy(); --activityCounter; if(activityCounter==0) { // Last instance code... } } public boolean isLastInstance() { return (activityCounter==1); } } 

Cela a assez bien fonctionné jusqu’à présent; et indépendamment de la version de l’API. Il faut bien sûr que toutes les activités étendent cette classe de base – ce qu’elles font dans mon cas.

Edit: J’ai remarqué une instance où le compteur descend à zéro avant que l’application ne quitte complètement, c’est-à-dire lorsque l’orientation est modifiée et qu’une seule activité est ouverte. Lorsque l’orientation change, l’activité est fermée et une autre est créée. onDestroyed est donc appelé pour la dernière activité, puis onCreate est appelé lorsque la même activité est créée avec l’orientation modifiée. Ce comportement doit être pris en compte; OrientationEventListener peut éventuellement être utilisé.

Android implémente une stack d’activité, je vous suggère de lire à ce sujet ici . Il semble que tout ce que vous voulez faire est de récupérer l’activité appelante: getCallingActivity() . Si l’activité en cours est la première activité de votre application et que l’application a été lancée à partir de l’écran d’accueil, elle doit (je suppose) renvoyer null .

La seule chose qui a manqué ici, est la touche “Home”, quand elle est activée, vous ne pouvez pas détecter cela de votre activité, il serait donc préférable de contrôler la stack d’activité par programme en manipulant “Back key” juste faire les étapes nécessaires.

En outre, vous ne pouvez pas être certain que le démarrage de votre activité à partir de la liste “Activité récente” peut être détecté en prédéfinissant certaines données supplémentaires dans l’intention d’ouvrir une activité, car elle est réutilisée dans ce cas.