413 votes

Terminer toutes les activités précédentes

Mon application comporte les écrans de flux suivants :

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Maintenant, j'ai un point commun log out dans chaque écran

( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5 )

Je veux que lorsque l'utilisateur clique sur le bouton de déconnexion (à partir de n'importe quel écran), tous les écrans soient terminés et qu'un nouvel écran soit créé. Log in ouvrira .

J'ai essayé presque toutes les FLAG_ACTIVITY pour y parvenir. J'ai également parcouru quelques réponses dans stackoverflow, mais sans parvenir à résoudre le problème. Mon application est sur Android 1.6 donc ne pas être capable d'utiliser FLAG_ACTIVITY_CLEAR_TASK

Y a-t-il un moyen de résoudre ce problème ?

0 votes

Exécutez-vous vos activités imbriquées en utilisant startActivityForResult ?

0 votes

Non, toutes les activités sont lancées avec startActivity.

0 votes

J'utilise des activités imbriquées alors que Cod exécute finishaffinitytask() dans une activité imbriquée. Est-ce que cela change le comportement ? car parfois j'obtiens un échec dans la livraison du résultat ResultInfo lorsque finishaffinitytask est exécuté.

595voto

DArkO Points 5974

Utilisez :

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Cela permettra d'effacer toutes les activités qui se trouvent au-dessus de la maison.

En supposant que vous terminez l'écran de connexion lorsque l'utilisateur se connecte et que la maison est créée, puis tous les écrans de 1 à 5 au-dessus de celui-ci. Le code que j'ai posté vous ramènera à l'écran d'accueil en terminant toutes les autres activités. Vous pouvez ajouter un extra dans l'intention et le lire dans l'activité de l'écran d'accueil et le terminer également (peut-être lancer l'écran de connexion à nouveau à partir de là ou autre).

Je ne suis pas sûr mais vous pouvez aussi essayer de vous connecter avec ce drapeau. Je ne sais pas comment les activités seront ordonnées dans ce cas. Je ne sais donc pas si cela effacera celles qui se trouvent sous l'écran sur lequel vous êtes, y compris celui sur lequel vous êtes actuellement, mais c'est certainement la solution.

1 votes

L'utilisateur affiche son premier écran comme écran d'accueil, c'est le problème principal.

0 votes

Le processus appelle donc l'intention ci-dessus à partir de n'importe quel écran, reçoit l'intention sur l'écran d'accueil et lance instantanément une intention pour se connecter et terminer l'écran d'accueil après la méthode startActivity. Vous pouvez également remplacer l'animation en attente par null pour les entrées et les sorties afin de ne pas montrer la transition (je fais cela parce que cela semble plus rapide).

0 votes

Clear top fonctionne pour effacer tout ce qui se trouve au-dessus de l'activité que vous appelez avec l'intention. cela signifie donc que si des activités s'empilent au-dessus de home, elles seront effacées. il suffit ensuite de lancer l'activité de connexion. je l'ai utilisé comme cela et je n'ai eu aucun problème avec cela. vous devez également déclarer l'activité comme ayant une seule instance afin de ne pas lancer accidentellement une autre instance de l'activité home (qui serait alors au-dessus et ne pourrait pas effacer les choses en dessous)

339voto

Kong Ken Points 133

Vous pouvez essayer Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK . Il effacera totalement toutes les activités précédentes et commencera une nouvelle activité.

11 votes

La bonne solution, mais seulement pour l'API 11+.

0 votes

J'ai fini par utiliser ce drapeau supplémentaire car il ne provoque pas de retard lors de l'affichage de l'activité principale (il ne la redémarre pas, ce qui est beaucoup plus rapide).

2 votes

@riwnodennyk pourquoi API 11+ ?

157voto

Henrique Points 1295

Avant de lancer votre nouvelle activité, il suffit d'ajouter le code suivant :

finishAffinity();

Ou si vous voulez qu'il fonctionne dans les versions précédentes d'Android :

ActivityCompat.finishAffinity(this);

12 votes

ActivityCompat.finishAffinity(this) ; appelle activity.finish() pour api < 16. Donc ça ne marchera pas.

1 votes

@Beto Caldas, j'ai confirmé le code source moi-même, il ne fonctionnera pas pour API < 16 comme AamirAbro l'a mentionné. Il va juste terminer l'activité que vous passez sur API < 16.

39voto

Eric Leschinski Points 14289

Lorsque l'utilisateur souhaite quitter toutes les activités ouvertes Pour que l'utilisateur soit en mesure d'utiliser l'application, il doit appuyer sur un bouton qui charge la première activité qui s'exécute au démarrage de l'application, effacer toutes les autres activités, puis faire en sorte que la dernière activité se termine. Faites exécuter le code suivant lorsque l'utilisateur appuie sur le bouton de sortie. Dans mon cas, LoginActivity est la première activité de mon programme à s'exécuter.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Le code ci-dessus efface toutes les activités à l'exception de LoginActivity . Ensuite, placez le code suivant dans le fichier LoginActivity 's onCreate(...) à écouter quand LoginActivity est recréé et le signal 'EXIT' a été passé :

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Pourquoi est-il si difficile de créer un bouton de sortie dans Android ?

Android s'efforce de vous décourager d'avoir un bouton "quitter" dans votre application, car ils veulent que l'utilisateur ne se soucie jamais de savoir si les programmes qu'il utilise sont exécutés en arrière-plan ou non.

Les développeurs du système d'exploitation Android veulent que votre programme puisse survivre à un arrêt inattendu et à une mise hors tension du téléphone, et que lorsque l'utilisateur redémarre le programme, il reprenne là où il s'était arrêté. L'utilisateur peut donc recevoir un appel téléphonique pendant qu'il utilise votre application, et ouvrir des cartes, ce qui nécessite de libérer des ressources supplémentaires pour votre application.

Lorsque l'utilisateur reprend votre application, il reprend là où il s'est arrêté, sans interruption. Ce bouton de sortie usurpe le pouvoir du gestionnaire d'activité, ce qui peut causer des problèmes avec le cycle de vie des programmes Android géré automatiquement.

32voto

Gem Points 178
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Cela fonctionnera pour toutes les versions d'Android. Où IntentCompat la classe ajoutée dans la bibliothèque de support Android.

0 votes

IntentCompat.FLAG_ACTIVITY_CLEAR_TASK n'est pas reconnu, utilisez Intent au lieu de IntentCompat .

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