143 votes

Android : Supprimez toutes les activités précédentes de la pile arrière

Lorsque je clique sur Déconnexion dans mon Profil Activité à laquelle je veux amener l'utilisateur Connexion où il doit utiliser de nouvelles informations d'identification.

J'ai donc utilisé ce code :

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

dans le onButtonClick du bouton de déconnexion.

Mais le problème est que lorsque je clique sur le bouton de retour de l'activité de connexion, je suis renvoyé à l'activité de profil. Je m'attendais à ce que l'application se ferme lorsque je clique sur le bouton de retour de l'activité de connexion.

Qu'est-ce que je fais mal ?

J'ai également ajouté android:launchMode="singleTop" dans le manifeste de mon Activité de connexion

Merci.

360voto

kgiannakakis Points 62727

La solution proposée aquí a fonctionné pour moi :

Java

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Kotlin

val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

Cependant, elle nécessite un niveau d'API >= 11.

31voto

Anup Cowkur Points 11763

Voici une solution pour effacer toutes les activités de votre application lorsque vous utilisez le bouton de déconnexion.

Chaque fois que vous commencez une activité, commencez-la comme ceci :

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

Lorsque vous voulez fermer l'application entière, faites ceci :

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL est une variable globale finale avec un nombre entier unique pour signaler que vous voulez fermer toutes les activités.

Ensuite, définissez le rôle de chaque activité onActivityResult(...) de sorte que lorsqu'une activité revient avec la valeur RESULT_CLOSE_ALL, elle appelle également finish() :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Cela provoquera un effet de cascade qui fermera toutes vos activités.

Il s'agit cependant d'un hack qui utilise startActivityForResult d'une manière qui n'a pas été conçue pour être utilisée.

Une meilleure façon de procéder serait peut-être d'utiliser des récepteurs de diffusion comme indiqué ici :

Lors de la déconnexion, la pile de l'historique des activités est effacée, ce qui empêche le bouton "retour" d'ouvrir des activités réservées aux personnes connectées.

Voir ces fils de discussion pour d'autres méthodes également :

Android : Effacer la pile arrière

Terminer toutes les activités précédentes

23voto

Matt Accola Points 1163

Pour vider complètement la pile d'activités, vous devez créer une nouvelle pile de tâches à l'aide de TaskStackBuilder, par exemple :

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

Cela permettra non seulement de créer une nouvelle pile de tâches propre, mais aussi de faire fonctionner correctement le bouton "haut" si votre LoginActivity a une activité parente.

19voto

Anurag Srivastava Points 353

finishAffinity() ajouté dans l'API 16. Utilisez ActivityCompat.finishAffinity() dans les versions précédentes. Lorsque vous lancez une activité en utilisant l'intention et terminez l'activité en cours. Maintenant, utilisez ActivityCompat.finishAffinity() au lieu de finish() . il terminera toutes les activités empilées sous l'activité en cours. Cela fonctionne bien pour moi.

10voto

Mongi Zaidi Points 159

Ce qui a marché pour moi

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X