Je veux savoir si l'utilisateur reviendrait à l'écran d'accueil s'il quittait l'activité en cours.
Je veux savoir si l'utilisateur reviendrait à l'écran d'accueil s'il quittait l'activité en cours.
Réponses:
MISE À JOUR (juillet 2015):
Depuis getRunningTasks () se dépréciée, de l' API 21 , il est préférable de suivre raukodraug réponse ou Ed Burnette un (je préférerais la deuxième).
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:
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 seule tâche. S'il est possible que ce nombre de tâches existe pour votre application, vous devrez vérifier d'autres éléments de la liste des tâches . En savoir plus sur les tâches Tâches et Back Stack
isTaskRoot()
méthode.
Je vais publier 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
if (isTaskRoot()) { // do something }
J'espère que cela aidera les nouveaux débutants.Sur la base des réponses ci-dessus qui fonctionnent bien pour moi, je partage également un extrait de code afin qu'il soit facile à mettre en œuvre.
solution: j'ai utilisé isTaskRoot()
qui renvoie true si l'activité actuelle est uniquement une activité dans votre pile et autre que je gère également le cas dans lequel si j'ai une activité dans la pile, allez à la dernière activité de 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();
}
}
il existe une solution plus simple à cela, vous pouvez utiliser isTaskRoot () dans votre activité
Bien qu'il puisse y avoir un moyen d'y parvenir (voir les autres réponses), je suggérerais 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 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'application existante, vous pouvez intercepter la touche haut / bas pour la touche Retour et la méthode onBackPressed () et leur présenter un "Êtes-vous sûr?" rapide.
Une façon de garder une trace de cela 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 ensuite le vérifier comme ceci:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Le problème avec la solution de sandrstar est le suivant ActivityManager
: 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
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 configurer 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 l' AppCompatActivity , et qui a 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 étendent cette classe de base - ce qu'elles font, dans mon cas.
Edit: J'ai remarqué une instance lorsque 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 ouverte. Lorsque l'orientation change, l'activité est fermée et une autre est créée, ainsi onDestroyed
est appelée pour la dernière activité, puis onCreate
est appelée lorsque la même activité est créée avec l'orientation modifiée. Ce comportement doit être pris en compte; OrientationEventListener pourrait éventuellement être utilisé.
Android implémente une pile d'activité, je vous suggère de lire ici . On dirait que tout ce que vous voulez faire bien est - extraient 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 depuis l'écran d'accueil, elle devrait (je suppose) revenir null
.
La seule chose qui a manqué ici, c'est le clic "Touche Accueil", une fois activé, vous ne pouvez pas le détecter à partir de votre activité, il serait donc préférable de contrôler la pile d'activités par programme en gérant la "touche Retour", appuyez et passez à l'activité requise ou juste faire 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'ouverture de l'activité, car elles sont réutilisées dans ce cas.