web-dev-qa-db-fra.com

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

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

112
virsir

UPDATE (juil 2015):

Puisque getRunningTasks () est obsolète, à partir de l’API 21, il est préférable de suivre raukodraug réponse ou Ed Burnette n (je préférerais un second).


Il est possible de vérifier les tâches en cours et leur pile en utilisant ActivityManager .

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

  • demander les autorisations 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 valide que si vous avez une tâche unique. S'il y a une possibilité que ce nombre de tâches existe pour votre application, vous devez vérifier d'autres éléments taskList. En savoir plus sur les tâches Tasks and Back Stack


104
sandrstar

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 la racine d'une tâche.

J'espère que ça aide

146
raukodraug

il y a une solution plus simple à cela, vous pouvez utiliser isTaskRoot () dans votre activité

15
Laxmikant Revdikar

J'espère que cela aidera les débutants. Sur la base des réponses ci-dessus, ce qui me convient très bien, je partage également l'extrait de code afin qu'il soit facile à mettre en œuvre.

solution: J'ai utilisé isTaskRoot() qui retourne vrai si l'activité actuelle est uniquement une activité dans votre pile et autre que celui que je gère également cas dans lequel si j'ai une activité dans la pile, aller à la dernière activité dans la pile au lieu d'en ouvrir une nouvelle personnalisée.

dans votre activité

   @Override
    public void onBackPressed() {

        if(isTaskRoot()){
            startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
            // using finish() is optional, use it if you do not want to keep currentActivity in stack
            finish();
        }else{
            super.onBackPressed();
        }

    }
5
Abhishek Garg

Bien qu'il puisse y avoir un moyen d'y parvenir (voir d'autres réponses), je vous conseillerais de ne pas le faire. Normal Android les applications 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, insérez le code de sauvegarde 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 touche haut/bas pour la touche Retour et la méthode onBackPressed () et leur présenter un message "Êtes-vous sûr?" Rapide.

5
Ed Burnette

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

Chaque fois que vous démarrez 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 vérifier cela comme ceci:

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

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

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

Le Activity en bas de la pile devrait toujours obtenir cette catégorie par défaut, alors que les autres activités ne l’auraient pas.
Mais même si cela échoue sur certains appareils, vous pouvez le configurer au démarrage de votre Activity:

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

J'ai créé une classe de base pour toutes mes activités, en étendant le AppCompatActivity , et qui possède 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 quelle que soit la version de l'API. Il faut bien sûr que toutes les activités élargissent cette classe de base - ce qu’elles font, dans mon cas.

Edit: J'ai remarqué un cas où le compteur descend à zéro avant la fermeture complète de l'application, c'est-à-dire lorsque l'orientation est modifiée et qu'une seule activité est ouvert. Lorsque l'orientation change, l'activité est fermée et une autre est créée. Ainsi, onDestroyed est appelé pour la dernière activité, puis onCreate 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é.

2
Per Löwgren

La seule chose qui nous a échappé ici est le clic sur la touche "Accueil". Lorsque cette option est activée, vous ne pouvez pas le détecter dans votre activité. je fais juste les étapes nécessaires.

En outre, vous ne pouvez pas être sûr que le démarrage de votre activité à partir de la liste "Activité récente" peut être détecté en prédéfinissant des données supplémentaires dans l'intention d'intégrer une activité, car elle est réutilisée dans ce cas.

0
ACM64

Android implémente une pile d'activités, 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é d'appel: 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 devrait (je suppose) renvoyer null.

0