Comment utilisez-vous Intent.FLAG_ACTIVITY_CLEAR_TOP pour effacer la stack d’activités?

J’ai lu plusieurs articles sur l’utilisation de cet outil, mais il doit manquer quelque chose car cela ne fonctionne pas pour moi. Mon activité A a launchmode = “singleTop” dans le manifeste. Il commence l’activité B, avec launchmode = “singleInstance”. L’activité B ouvre un navigateur et reçoit et réintègre son activité, raison pour laquelle il s’agit d’une instance unique. J’essaie de remplacer le bouton Retour afin que l’utilisateur soit renvoyé à l’activité A et qu’il puisse ensuite appuyer sur Retour pour quitter l’activité plutôt que de revenir à l’activité B à nouveau.

// activity B @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) onBackPressed(); return super.onKeyDown(keyCode, event); } @Override public void onBackPressed() { startActivity(new Intent(this, UI.class) .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)); return; } 

Après être revenu du navigateur, la stack est … A, B, Browser, B

Je m’attends à ce que ce code change la stack en … A … pour que le fait de revenir en arrière ramène l’utilisateur à l’écran d’accueil.

Au lieu de cela, il semble changer la stack en … A, B, Navigateur, B, A … comme si ces drapeaux n’étaient pas là.

J’ai essayé d’appeler finish () dans l’activité B après startActivity, mais le bouton Retour me ramène à nouveau au navigateur!

Qu’est-ce que je rate? Je vous remercie!

@bitestar a la bonne solution, mais il y a encore une étape:

Il était caché dans les documents, mais vous devez remplacer le launchMode de launchMode de l’ Activity par un élément autre que standard . Sinon, il sera détruit et recréé au lieu d’être remis au sumt.

J’ai commencé l’activité A-> B-> C-> D. Lorsque vous appuyez sur le bouton Retour, l’activité DI veut aller à l’activité A. Puisque A est mon sharepoint départ et donc déjà sur la stack, toutes les activités en haut de A sont effacées et vous ne pouvez plus retourner à une autre activité de A .

Cela fonctionne réellement dans mon code:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent a = new Intent(this,A.class); a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(a); return true; } return super.onKeyDown(keyCode, event); } 

Pour cela, FLAG_ACTIVITY_CLEAR_TOP indicateur FLAG_ACTIVITY_CLEAR_TOP pour lancer Intent
(sans FLAG_ACTIVITY_NEW_TASK )

et launchMode = "singleTask" dans le manifeste pour l’activité lancée.

On dirait que cela fonctionne comme je l’ai besoin – l’activité ne redémarre pas et toutes les autres activités sont fermées.

Bien que cette question ait déjà des réponses suffisantes, je pensais que quelqu’un voudrait savoir pourquoi ce drapeau fonctionne de cette manière particulière, c’est ce que j’ai trouvé dans la documentation Android

L’instance en cours d’exécution de l’activité B dans l’exemple ci-dessus recevra soit la nouvelle intention que vous commencez ici dans sa méthode onNewIntent (), soit sera elle-même terminée et redémarrée avec la nouvelle intention.

S’il a déclaré que son mode de lancement est “multiple” (valeur par défaut) et que vous n’avez pas défini FLAG_ACTIVITY_SINGLE_TOP dans le même but, il sera alors terminé et recréé; pour tous les autres modes de lancement ou si FLAG_ACTIVITY_SINGLE_TOP est défini, cette intention sera transmise à onNewIntent () de l’instance actuelle.

Donc, soit,
1 . Remplacez le launchMode de launchMode de l’activité A par un autre élément standard (par exemple, singleTask ou autre). Ensuite, votre drapeau FLAG_ACTIVITY_CLEAR_TOP ne redémarrera pas votre activité A.

ou,

2 . Utilisez Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP comme indicateur. Ensuite, cela fonctionnera comme vous le souhaitez.

Je sais qu’il y a déjà une réponse acceptée, mais je ne vois pas comment cela fonctionne pour l’OP car je ne pense pas que FLAG_ACTIVITY_CLEAR_TOP soit significatif dans son cas particulier. Ce drapeau ne concerne que les activités de la même tâche . Selon sa description, chaque activité est dans sa propre tâche : A, B et le navigateur.

Quelque chose qui peut le jeter est que A est singleTop, quand il devrait être singleTask. Si A est singleTop et B démarre A, alors un nouveau A sera créé car A n’est pas dans la tâche de B. A partir de la documentation de singleTop:

“Si une instance de l’activité existe déjà en haut de la tâche en cours , le système l’achemine vers cette instance …”

Puisque B démarre A, la tâche en cours est la tâche de B, qui est pour une seule instance et ne peut donc pas inclure A. Utilisez singleTask pour obtenir le résultat souhaité car le système trouvera alors la tâche A et la mettra au premier plan.

Enfin, après que B a démarré A et que l’utilisateur appuie sur A, l’OP ne veut voir ni B ni le navigateur. Pour ce faire, l’appel de finish () dans B est correct; encore une fois, FLAG_ACTIVITY_CLEAR_TOP ne supprimera pas les autres activités dans la tâche de A car ses autres activités sont toutes dans des tâches différentes. La pièce qui lui manquait, cependant, est que B devrait également utiliser FLAG_ACTIVITY_NO_HISTORY lors du lancement de l’intention pour le navigateur. Remarque: si le navigateur est déjà en cours d’exécution avant même de lancer l’application de l’OP, vous verrez bien sûr le navigateur en appuyant sur A. Ainsi, pour tester cela, veillez à quitter le navigateur avant de lancer l’application.

FLAG_ACTIVITY_NEW_TASK est le problème qui initie une nouvelle tâche. Supprimez-la et vous avez terminé.

Eh bien, je vous recommande de lire ce que chaque drapeau fait avant de travailler avec eux

Lisez ceci et Intent Flags here

Au début, j’avais aussi du mal à faire fonctionner FLAG_ACTIVITY_CLEAR_TOP. Finalement, je l’ai fait fonctionner en utilisant la valeur de celui-ci (0x04000000). On dirait donc qu’il y a un problème avec Eclipse / comstackr. Mais malheureusement, l’activité qui a survécu est relancée, ce qui n’est pas ce que je veux. On dirait donc qu’il n’y a pas de solution facile.

Ajouter android: noHistory = “true” dans le fichier manifeste.

    

J’utilise trois drapeaux pour résoudre le problème:

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 

J’ai appelé activity_name.this.finish() après avoir lancé une nouvelle intention et cela a fonctionné pour moi.

 I sortinged "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK" 

Mais ça ne marchera pas pour moi … Je ne propose pas cette solution pour l’utilisation, mais si le paramétrage du drapeau ne fonctionne pas pour vous, vous ne pouvez pas essayer ceci.