android-intent flag_activity_clear_top launchmode - Android: Effacer la pile arrière



14 Answers

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
back stack manifest

Dans Android, j'ai quelques activités, disons A, B, C.

Dans AI, utilisez ce code pour ouvrir B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

Dans BI, utilisez ce code pour ouvrir C:

Intent intent = new Intent(this, C.class);
startActivity(intent);

Lorsque l'utilisateur appuie sur un bouton dans CI, vous voulez revenir à A et effacer la pile arrière (fermer à la fois B et C). Donc, lorsque l'utilisateur utilise le bouton retour B et C ne s'affiche pas, j'ai essayé ce qui suit:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

Mais B et C sont toujours visibles si j'utilise le bouton retour quand je suis de retour dans l'activité A. Comment puis-je éviter cela?




Cela me dérange pendant longtemps. Enfin, je l'ai fait en faisant ceci:

En fragment, utilisez:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

Dans Activité, utilisez (ajoutez un autre indicateur d'intention Intent.FLAG_ACTIVITY_CLEAR_TASK par rapport au fragment):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);






Pour de futures recherches, essayez ce code.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();



Utilisez finishAffinity (); dans la tâche C lors du démarrage de la tâche A pour effacer les activités de backstack.




J'ai trouvé les réponses un peu trompeuses parce que le code dans la question initiale semble bien fonctionner pour moi?

Avec A étant l'activité racine, le démarrage à partir de B ou C uniquement avec FLAG_ACTIVITY_CLEAR_TOP supprime B et C de la pile arrière.




Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.



Il me semble que vous devez démarrer l' Activity C partir de l' Activity B en utilisant startActivityForResult() . Lorsque vous cliquez sur un bouton dans l' Activity C , appelez setResult(RESULT_OK) et finish() pour que l' Activity C soit terminée. Dans l' Activity B , vous pouvez répondre à onActivityResult() en appelant également finish() sur lui-même, et vous serez alors ramené à l' Activity A




Vous pouvez utiliser cet exemple pour appeler votre Activity A depuis l' Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);




En plus de FLAG_ACTIVITY_CLEAR_TOP , vous pouvez également ajouter Intent.FLAG_ACTIVITY_SINGLE_TOP :

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);




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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Mais cela ne marchera pas pour moi ... Je ne suggère pas cette solution pour l'utilisation mais si la mise en drapeau ne fonctionnera pas pour vous que vous pouvez essayer ceci ... Mais je recommande encore de ne pas l'utiliser




Dans le manifeste

android:launchMode="singleTask"

et

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);



Utilisez la méthode setFlags () pour effacer le verso ouvert toute activité close et démarrez votreActvity

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);



C'est une réponse vraiment ancienne et je n'ai pas vraiment trouvé de solution appropriée, dans le seul but d'effacer backStack, j'ai décidé de créer mon propre backstack, ce qui n'est même pas une pile tbh, mais ça n'a pas être, puisque nous voulons tout effacer de toute façon;

Theres un overhead de handlind le backstack chaque fois, mais il m'a donné le contrôle dont j'avais besoin;

Déclare d'abord une liste publique statique d'activités (ou des fragments, tout ce dont vous avez besoin);

public static ArrayList <Activity> backStack = new ArrayList<>();

Et dans la méthode onCreate de toutes les autres activités:

MainActivity.backStack.add(this);

Et enfin, quand vous voulez effacer le backstack, appelez simplement:

public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}





Related