web-dev-qa-db-fra.com

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 bouton 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 seront terminés et un nouvel écran Log in s'ouvrira.

J'ai essayé presque tous les FLAG_ACTIVITY pour y parvenir. Je vais aussi à travers quelques réponses dans stackoverflow, mais ne pouvant pas résoudre le problème. Mon application est sur Android 1.6 donc je ne peux pas utiliser FLAG_ACTIVITY_CLEAR_TASK

Y at-il un moyen de résoudre le problème?

340
Tanmay Mandal

Utilisation:

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

Cela effacera toutes les activités au sommet de la maison.

En supposant que vous avez terminé l'écran de connexion lorsque l'utilisateur se connecte et que la page d'accueil est créée, puis tous les écrans de 1 à 5 en haut 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 élément supplémentaire à l'intention et le lire dans l'activité de l'écran d'accueil et le terminer également (par exemple, relancez l'écran de connexion à partir de là ou quelque chose d'autre).

Je ne suis pas sûr, mais vous pouvez aussi essayer d'aller vous connecter avec ce drapeau. Je ne sais pas comment les activités seront ordonnées dans ce cas. Donc, je ne sais pas s’il va effacer ceux en-dessous de l’écran sous lequel vous êtes, y compris celui sur lequel vous êtes actuellement, mais c’est définitivement la voie à suivre.

J'espère que cela t'aides.

502
DArkO

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

294
Kong Ken

Avant de lancer votre nouvelle activité, ajoutez simplement le code suivant:

finishAffinity();

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

ActivityCompat.finishAffinity(this);
125
Henrique

Lorsque l'utilisateur souhaite quitter toutes les activités ouvertes, il doit appuyer sur un bouton qui charge la première activité qui s'exécute au démarrage de votre application, désélectionne toutes les autres activités, puis termine la dernière activité restante. 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 à être exécutée.

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, insérez le code suivant dans la onCreate(...) de LoginActivity, pour savoir quand LoginActivity est recréé et que le signal 'EXIT' a été transmis:

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

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

Android s’efforce de vous dissuader d’avoir un bouton "Quitter" dans votre application, car il souhaite que l’utilisateur ne se préoccupe jamais de savoir si les programmes qu’il utilise sont exécutés en arrière-plan ou non.

Les développeurs Android du système d’exploitation veulent que votre programme puisse survivre à un arrêt inattendu et à une mise hors tension du téléphone. Lorsque l’utilisateur redémarre le programme, ils reprennent là où ils se sont arrêtés. Ainsi, l'utilisateur peut recevoir un appel téléphonique pendant qu'il utilise votre application et ouvrir des cartes nécessitant que votre application soit libérée pour davantage de ressources.

Lorsque l'utilisateur reprend votre application, il récupère là où il s'est arrêté sans interruption. Ce bouton de sortie utilise l'énergie du gestionnaire d'activités, ce qui peut entraîner des problèmes avec le cycle de vie du programme automatiquement géré Android.

38
Eric Leschinski
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 Android. Où IntentCompat la classe ajoutée dans Android Bibliothèque de supports.

31
Gem

Utilisez ce qui suit pour l'activité

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

supprime l'indicateur CLEAR_TASK pour une utilisation de fragment.

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

30
Aristo Michael

De developer.Android.com :

public void finishAffinity ()

Ajouté dans le niveau 16 de l'API

Terminez cette activité ainsi que toutes les activités immédiatement inférieures à celle-ci dans la tâche en cours ayant la même affinité. Cela est généralement utilisé lorsqu'une application peut être lancée sur une autre tâche (par exemple à partir d'un ACTION_VIEW d'un type de contenu qu'elle comprend) et que l'utilisateur a utilisé la navigation vers le haut pour passer de la tâche en cours à sa propre tâche. Dans ce cas, si l'utilisateur a accédé à une autre activité de la deuxième application, toutes ces activités doivent être supprimées de la tâche d'origine dans le cadre du commutateur de tâches.

Notez que cette fin ne vous permet pas de fournir des résultats à l'activité précédente et une exception sera levée si vous essayez de le faire.

20
gmrl

Je suppose que je suis en retard mais il y a une réponse simple et courte. Il existe une méthode finishAffinity () dans Activity qui termine l'activité en cours et toutes les activités parent, mais elle ne fonctionne que dans Android 4.1 ou version ultérieure.

Pour API 16+, utilisez

finishAffinity();

Pour les moins de 16 ans, utilisez

ActivityCompat.finishAffinity(YourActivity.this);

J'espère que ça aide!

18
Akshay Taru

Si votre application a au minimum la version 16 de sdk, vous pouvez utiliser finishAffinity ()

Terminez cette activité ainsi que toutes les activités immédiatement inférieures à celle-ci dans la tâche en cours ayant la même affinité.

C'est un travail pour moi. Dans l'écran Top Payment, supprimez toutes les activités de pile arrière,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.Android.com/reference/Android/app/Activity.html#finishAffinity%28%29

13
Jaydeep purohit

Sur une note de côté, bon à savoir
Cette réponse fonctionne ( https://stackoverflow.com/a/13468685/7034327 )

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

alors que cela ne fonctionne pas

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() remplace tous les drapeaux précédents et n'ajoute aucun nouveau drapeau, alors que .addFlags() le fait.

Donc cela fonctionnera aussi

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
13
John

Pour le bouton de déconnexion sur le dernier écran de l'application, utilisez ce code sur l'écouteur de bouton de déconnexion pour terminer toutes les activités précédentes, et votre problème est résolu.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
10
Amrit

Une solution que j'ai mise en place pour cela (je pense l'avoir trouvée quelque part sur Stack Overflow, mais je ne m'en souviens pas, donc merci à celui qui l'a fait en premier lieu):

À partir de l’une de vos activités, faites ceci:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Puis dans votre LoginActivity, écrasez onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
10
Andy

j'ai le même problème, vous pouvez utiliser IntentCompat, comme ceci:

import Android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

ce code fonctionne pour moi.

Android api 17

8
    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();
8
Prashant Kumar

au lieu d'utiliser finish() utilisez simplement finishAffinity();

7
Hitesh Kushwah

Dans mon cas, j'utilise finishAffinity() dans la dernière activité comme:

finishAffinity()
startHomeActivity()

J'espère que ça va être utile.

6
Djek-Grif

pour API> = 15 à API 23 solution simple.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);
6
Kamal Bunkar

Enregistrer dans> Accueil-> écran 1-> écran 2-> écran 3-> écran 4-> écran 5

sur l'écran 4 (ou tout autre) ->

StartActivity (Connexion)
FLAG_ACTIVITY_CLEAR_TOP
6
Plamen Nikolov

Si vous utilisez startActivityForResult() dans vos activités précédentes, remplacez simplement OnActivityResult() et appelez la méthode finish(); à l'intérieur de toutes les activités .. Cela fera l'affaire ...

5
ngesh

Lorsque l'utilisateur clique sur le bouton de déconnexion, écrivez le code suivant:

Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Et aussi lorsque, après la connexion, si vous appelez une nouvelle activité, n'utilisez pas finish ();

3
nikki

Simplement, lorsque vous quittez l'écran de connexion, pas lorsque vous terminez l'écran de connexion.

Et dans toutes les activités à venir, utilisez ceci pour vous déconnecter:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

Ça fonctionne parfaitement.

2
Asad Rao

J'ai trouvé ça, ça va effacer toute l'histoire et sortir

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);
1
pirooz jenabi

Si vous vous connectez à l’utilisateur dans screen 1 et à partir de là, vous accédez aux autres écrans, utilisez

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
1
Gabriel Negut

J'ai constaté que cette solution fonctionnait sur tous les appareils malgré le niveau d'API (même pour les <11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
0
priyankvex