web-dev-qa-db-fra.com

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

Lorsque je clique sur le bouton déconnexion de ma page profil, je souhaite amener l'utilisateur à la page connexion, où il doit utiliser de nouvelles informations d'identification.

C'est pourquoi j'ai 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 Logout.

Mais le problème est que lorsque je clique sur le bouton de retour du périphérique dans l'activité de connexion, il m'emmène à ProfileActivity. Je m'attendais à ce que l'application se ferme lorsque j'appuie sur le bouton de retour de l'appareil sur LoginActivity.

Qu'est-ce que je fais mal?

J'ai également ajouté Android:launchMode="singleTop" dans le manifeste de mon LoginActivity

Merci

100
Archie.bpgc

La solution proposée ici 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(OldActivity.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, cela nécessite un niveau d'API> = 11.

262
kgiannakakis

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

Chaque fois que vous démarrez une activité, démarrez-la comme suit:

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

Lorsque vous souhaitez fermer l'application entière, procédez comme suit:

setResult(RESULT_CLOSE_ALL);
finish();

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

Définissez ensuite le callback onActivityResult(...) de chaque activité. Ainsi, lorsqu'une activité retourne 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 ferme toutes vos activités.

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

Une meilleure façon de faire cela consisterait peut-être à utiliser des récepteurs de diffusion comme indiqué ci-dessous:

À la déconnexion, effacez la pile de l'historique des activités, en empêchant le bouton "Précédent" d'ouvrir des activités uniquement connectées

Voir ces discussions pour d'autres méthodes aussi:

Android: Efface la pile arrière

Terminer toutes les activités précédentes

31
Anup Cowkur

Pour vider complètement la pile d'activités, vous souhaitez 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 créera non seulement une nouvelle pile de tâches, mais permettra également le bon fonctionnement du bouton "haut" si votre activité LoginActivity a une activité parent.

17
Matt Accola

finishAffinity() ajouté dans l'API 16. Utilisez ActivityCompat.finishAffinity() dans les versions précédentes. Lorsque vous lancerez une activité en utilisant l'intention et que vous terminez l'activité en cours. Maintenant, utilisez ActivityCompat.finishAffinity() à la place de finish(). toutes les activités empilées seront terminées en dessous de l'activité en cours. Ça fonctionne bien pour moi.

14
Anurag Srivastava

Ce qui a fonctionné pour moi

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

Pour API 11+, vous pouvez utiliser Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK comme ceci:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

Il effacera totalement toutes les activités précédentes et démarrera une nouvelle activité.

5
madx

Une solution possible que je puisse vous suggérer consiste à ajouter Android:launchMode="singleTop" dans le manifeste pour mon ProfileActivity . et lorsque vous cliquez sur la déconnexion, vous pouvez vous déconnecter et recommencer vous LoginActivity. à la déconnexion, vous pouvez appeler cela.

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
4
Android

Vous pouvez essayer finishAffinity(), il ferme toutes les activités en cours et fonctionne à partir de Android 4.1.

4
Bunny

Je suis aussi confronté au même problème ..

dans l'activité de connexion, ce que je fais est.

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

à la déconnexion

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

Cela fonctionne bien, mais lorsque je suis dans ActivityLoggedIn et que je minimise l'application et que je clique sur l'icône du bouton de lancement dans le tiroir de l'application, MainActivity redémarre: -/i utilise l'indicateur

Android:LaunchMode:singleTask 

pour le MainActivity.

2
Sujal Mandal

Utilisez ce qui suit pour activity

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

remove CLEAR_TASK indicateur pour l'utilisation des fragments.

J'espère que cela peut utiliser pour certaines personnes.

2
Aristo Michael

Essayez ceci cela fonctionnera:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
1
Mohammad

Il suffit de garder

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

Dans les API de niveau 11 ou supérieur, utilisez les balises FLAG_ACTIVITY_CLEAR_TASK et FLAG_ACTIVITY_NEW_TASK sur Intent pour effacer toute la pile d'activités.

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);
1
S.Sathya Priya

Aucun des indicateurs d'intention n'a fonctionné pour moi, mais voici comment je l'ai corrigé:

Lorsqu'un utilisateur se déconnecte d'une activité, je devais diffuser un message de cette activité, puis le recevoir dans les activités que je voulais fermer, après quoi j'appellerais finish (); et ça marche plutôt bien.

1
Ian Wambai

tilisez ceci

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
0
Prashant Kumar