web-dev-qa-db-fra.com

Pourquoi FLAG_ACTIVITY_CLEAR_TOP ne fonctionne pas?

Comme le titre l'indique, Pourquoi intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) ou intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) ne fonctionnera pas?

J'ai 3 activités disons A, B et C.

Lorsque j'essaie de lancer l'activité A à partir de C avec du code:

Intent i = new Intent(this, A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

Il démarre simplement l'activité A mais n'efface pas le sommet.! -_-

J'ai également essayé d'utiliser setFlags().

J'ai lu différentes questions sur SO à propos de ce problème, mais je n'ai pas trouvé la bonne réponse.> _ <

Aidez quelqu'un!

Modifier

Code pour onBackPressed () dans l'activité 'A' comme demandé par @codeMagic.

@Override
public void onBackPressed(){
    if(wvLogin.canGoBack())
        wvLogin.goBack();
    else
        super.onBackPressed();
}
14
ashu

Dans la documentation de FLAG_ACTIVITY_CLEAR_TOP :

Si défini, et que l'activité en cours de lancement est déjà en cours d'exécution dans la tâche en cours , puis au lieu de lancer une nouvelle instance de cette activité, toutes les autres activités en plus de cela sera fermé et cette intention sera livrée à l'ancienne activité (maintenant en haut) en tant que nouvelle intention.

Comme vous l'avez ajouté dans votre commentaire, l'activité A a été terminée avant d'appeler B, donc cette situation ne s'applique pas. Une nouvelle instance de l'activité A sera lancée à la place.

Selon moi, vous avez deux options ici:

1) Utilisez les drapeaux Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK. Cela démarrera l'activité A en tant que racine de la pile. Cela fonctionne, mais toutes les autres activités de la pile seront perdues. En supposant que A était la première activité (ou du moins, que vous n'êtes intéressé par aucune des activités précédentes dans la pile des tâches), cela n'a pas d'importance. Remarque: CLEAR_TASK nécessite l'API niveau 11.

2) Une autre solution possible (au cas où l'hypothèse précédente ne serait pas vraie) serait de ne pas utiliser du tout d'indicateurs d'intention:

  • B démarre C avec startActivityForResult().
  • Au lieu d'appeler A, C termine, après avoir défini un résultat pour B indiquant que A doit être lancé.
  • Dans B.afterActivityResult(), terminez B et lancez A.
37
matiash

Vous manquez le Intent.FLAG_ACTIVITY_SINGLE_TOP drapeau

Essaye ça:

Intent i = new Intent(this, A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
5
goodKode

Vous avez utilisé une intention différente: utilisez celle que vous avez initialisée:

  Intent i = new Intent(this, A.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\WRONG;;
  startActivity(i);

solution:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\RIGHT;;

Vous pouvez soit mettre un noHistory fidèle à l'activité A dans le manifeste

Android:noHistory=true
3
Rod_Algonquin