Android: Effacer la pile arrière



Answers

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Question

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?




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 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




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.




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);



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




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();
    }
}



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();



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);







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);



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);




Related