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
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.
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:
voir ces fils pour d'autres méthodes aussi bien:
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.
ce qui a fonctionné pour moi
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
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.
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é.
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();
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.
vous pouvez essayer finishAffinity()
, il ferme toutes les activités en cours et fonctionne sur et au-dessus Android 4.1
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();
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.
continuez
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
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.
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();
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);