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
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);
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.
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:
Voir ces discussions pour d'autres méthodes aussi:
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.
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.
Ce qui a fonctionné pour moi
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
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é.
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();
Vous pouvez essayer finishAffinity()
, il ferme toutes les activités en cours et fonctionne à partir de Android 4.1.
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.
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.
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();
Il suffit de garder
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
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);
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.
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();