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

quand je clique sur Logout bouton dans mon profil activité je veux amener l'utilisateur à Login page, où il doit utiliser de nouveaux justificatifs d'identité.

donc 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 de Déconnexion.

mais le problème est que lorsque je clique sur le bouton de retour de l'appareil sur L'activité de connexion, il m'amène à la ProfileActivity. Je m'attendais à ce que l'application se ferme quand j'ai appuyé sur le bouton de retour de l'appareil sur la LoginActivity.

Qu'est-ce que je fais de mal?

j'ai aussi ajouté android:launchMode="singleTop" dans le Manifeste pour mon LoginActivity

Merci

79
demandé sur Archie.bpgc 2012-10-18 09:48:29

15 réponses

la solution proposée ici , a fonctionné pour moi.

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

cependant, il nécessite un niveau D'API >= 11.

225
répondu kgiannakakis 2016-01-14 13:00:54

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

chaque fois que vous commencez une activité, commencez comme ceci:

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

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

setResult(RESULT_CLOSE_ALL);
finish();

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

définit alors les onActivityResult(...) callback ainsi quand une activité retourne avec la valeur RESULT_CLOSE_ALL, elle appelle aussi 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 va causer un effet de cascade qui ferme toutes vos activités.

il s'agit d'un hack cependant et utilise startActivityForResult d'une manière qu'il n'a pas été conçu pour être utilisé.

peut-être une meilleure façon de faire cela serait d'utiliser des récepteurs de radiodiffusion comme montré ici:

On déconnexion, effacer la pile de l'historique des activités, empêchant le bouton "Retour" d'ouvrir les Activites

voir ces fils pour d'autres méthodes aussi bien:

Android: effacer la pile arrière

terminer toutes les activités antérieures

29
répondu Anup Cowkur 2017-05-23 11:47:23

pour effacer complètement la pile d'activités, vous voulez créer une nouvelle pile de tâches en utilisant TaskStackBuilder, par exemple:

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

cela ne créera pas seulement une nouvelle pile de tâches propre, cela permettra également le bon fonctionnement du bouton" up " si votre LoginActivity a une activité parent.

15
répondu Matt Accola 2014-09-08 04:56:40

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
répondu Mongi Zaidi 2014-04-24 10:30:32

finishAffinity(Activity activity) ajouté dans API 16. Utilisez ActivityCompat.finishAffinity(Activity activity) dans les versions précédentes. Quand vous lancerez n'importe quelle activité en utilisant intention et terminer() l'activité actuelle. Maintenant, utilisez ActivityCompat.finishAffinity(Activity activity) à la place de finish() . il terminera toutes les activités empilées en dessous de l'activité actuelle. Il fonctionne très bien pour moi.

10
répondu Anurag Srivastava 2018-06-27 08:28:23

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 toute activité(s) antérieure (s) et commencera une nouvelle activité.

5
répondu madx 2015-02-24 19:03:10

une solution possible ce que je peux vous suggérer est d'ajouter android:launchMode="singleTop" dans le Manifeste pour mon ProfileActivity . et quand la déconnexion est cliquée u peut logoff vous redémarrez LoginActivity. sur la déconnexion, vous pouvez appeler ça comme ça.

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
4
répondu Android 2012-10-18 07:06:25

je suis également confronté à la même question..

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

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

déconnexion

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

cela fonctionne bien mais quand je suis dans L'ActivityLoggedIn et que je minimise l'application et que je clique sur l'icône du bouton de lancement sur le tiroir de l'application, L'activité principale recommence: - / j'utilise le drapeau

android:LaunchMode:singleTask 

pour L'activité principale.

2
répondu Sujal Mandal 2014-01-17 10:38:21

vous pouvez essayer finishAffinity() , il ferme toutes les activités en cours et fonctionne sur et au-dessus Android 4.1

2
répondu Bunny 2015-07-13 07:47:24

Essayez cela, il va travailler:

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();
2
répondu Mohammad 2017-06-13 10:31:31

utilisez ce qui suit pour activity

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

supprimer CLEAR_TASK drapeau " fragment d'utilisation.

j'espère que cela peut être utile pour certaines personnes.

2
répondu Aristo Michael 2018-04-06 08:59:36

continuez

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
1
répondu Gaurav Vashisth 2012-10-18 06:07:55

aucun des drapeaux d'intention n'a fonctionné pour moi, mais c'est comme ça que je l'ai réparé:

quand un utilisateur se connecte à une activité, j'ai dû diffuser un message de cette activité, puis le recevoir dans les activités que je voulais fermer après quoi j'appelle finish(); et ça fonctionne assez bien.

1
répondu Ian Wambai 2017-01-09 09:06:39

utilisez cette

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();
1
répondu Prashant Kumar 2018-04-06 08:59:17

dans le niveau IPA 11 ou plus, utilisez les indicateurs FLAG_ACTIVITY_CLEAR_TASK et FLAG_ACTIVITY_NEW_TASK pour éliminer 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
répondu S.Sathya Priya 2018-04-06 09:00:16