web-dev-qa-db-fra.com

Terminer toutes les activités à la fois

J'ai une application avec plusieurs pages, c'est-à-dire plusieurs activités et certaines d'entre elles restent ouvertes. 

Est-il possible de fermer toutes les activités en même temps?

52
steve

Lorsque vous souhaitez quitter toutes les activités en cours, vous devez appuyer sur un bouton qui charge la première activité qui s'exécute au démarrage de votre application, puis efface toutes les autres activités, puis termine la dernière activité restante. pour ce faire, appliquez le code suivant dans votre projet

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

Le code ci-dessus termine toutes les activités sauf FirstActivity. Ensuite, nous devons terminer le processus de FirstActivity Entrez le code ci-dessous dans le champ Firstactivity de oncreate

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

et vous avez fini ....

116
letsnurture

Il existe une méthode finishAffinity() dans Activity qui termine l'activité actuelle et toutes les activités parent, mais elle ne fonctionne que sous Android 4.1 ou version ultérieure.

Pour API 16+, utilisez

finishAffinity();

Pour inférieur (Android 4.1 inférieur), utilisez 

ActivityCompat.finishAffinity(YourActivity.this);
53
King of Masses

La meilleure solution que j'ai trouvée, compatible avec les appareils ayant un niveau d'API <11

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

Cette solution nécessite une bibliothèque de support Android.

22
Mongi Zaidi

Pour API 16+, utilisez

finishAffinity();

Pour les bas, utilisez

ActivityCompat.finishAffinity(YourActivity.this)
17
Radu Grigoras

Il existe trois solutions pour un historique d'activité clair.

1) Vous pouvez écrire finish() au moment de commencer une nouvelle activité par intention.

2) Ecrivez Android:noHistory="true" dans toutes les balises <activity> du fichier Androidmanifest.xml, en utilisant ceci si vous êtes ouvert à une nouvelle activité et que vous n'écrivez pas finish () à ce moment-là, l'activité précédente est toujours terminée.

<activity
    Android:name=".Splash_Screen_Activity"
    Android:label="@string/app_name"
    Android:noHistory="true">

</activity>

3) écrivez system.exit(0) pour quitter l'application.

11
Dipak Keshariya

Je me débattais avec le même problème. Ouvrir la page à propos et appeler finish(); à partir de là ne fermait pas l'application, c'était passer à l'activité précédente et je voulais fermer l'application à partir de la page à propos. 

C'est le code qui a fonctionné pour moi:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 
finish();

J'espère que cela t'aides.

9
TheOddAbhi

Si vous recherchez une solution qui semble être "à la livre" et conçue méthodologiquement (à l'aide d'un BroadcastReceiver), vous devriez consulter le lien suivant: http://www.hrupin.com/2011/10/comment-finir-toutes-les-activites-dans-votre-application-Android-via-simple-appel

Une légère modification est requise dans l'implémentation proposée qui apparaît dans ce lien - vous devez utiliser la méthode sendStickyBroadcast (Intent) (n'oubliez pas d'ajouter l'autorisation BROADCAST_STICKY à votre manifeste) plutôt que sendBroadcast (Intent), afin de permettre à votre Les activités mises en pause pour pouvoir recevoir la diffusion et la traiter, cela signifie que vous devez également supprimer cette diffusion persistante lors du redémarrage de votre application en appelant la méthode removeStickyBroadcast (Intent) dans la méthode onCreate () de votre activité d'ouverture.

Bien que les solutions basées sur startActivity (...) mentionnées ci-dessus, à première vue, semblent très jolies, élégantes, courtes, rapides et faciles à mettre en œuvre, elles se sentent un peu "mal" (pour démarrer une activité) avec tous les avantages possibles. frais généraux et les ressources qui peuvent être nécessaires et impliquées, juste pour le tuer? ...)

3
user3139591

Suivre deux drapeaux a fonctionné pour moi. Ils vont effacer tout les activités précédentes et en commencer une nouvelle 

  Intent intent = new Intent(getApplicationContext(), MyDetails.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

J'espère que cela t'aides. 

3
Ajji

Vous pouvez essayer juste finishAffinity (), sa fermeture toutes les activités en cours pour travailler dessus

2
Vinodh Kumar

Utilisation 

finishAffinity ();

Au lieu de:

System.exit(); or finish();

il quitte l'application complète ou toute activité.

1
Anandhu Vijayan

Vous pouvez stocker un drapeau booléen pour indiquer si toutes les activités doivent être terminées ou non (ce que vous préférez dans vos préférences partagées), alors la méthode onStart() de chaque activité devrait avoir quelque chose comme:

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
    finish();
}else
{
    //...
}

Évidemment, vous pouvez définir ce drapeau comme ci-dessous chaque fois que vous avez besoin de terminer toutes les activités (de l’activité en cours). Vous pouvez ensuite appeler la méthode finish () sur l’activité en cours qui aura pour effet de mettre fin à l’activité en cours. un, la méthode onStart () de chacun s'exécute et provoque son arrêt:

SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();

Si vous utilisez la méthode suggérée par @letsnurture, vous serez confronté à la question posée par @gumuruh.

1
Dmila Ram

Le problème avec finishAffinity() est que seules les activités de votre tâche actuelle sont fermées, mais les activités avec singleInstance launchMode et dans d'autres tâches sont toujours ouvertes et mises au premier plan après finishAffinity(). Le problème avec System.exit(0) est que vous terminez votre processus d'application avec tous les services d'arrière-plan et toute la mémoire allouée, ce qui peut entraîner des effets secondaires indésirables (par exemple, ne plus recevoir de notifications).

Voici d'autres deux alternatives qui résolvent les deux problèmes}:

  1. Utilisez ActivityLifecycleCallbacks dans votre classe d'application pour enregistrer les activités créées et les fermer si nécessaire: https://Gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10
  2. Lors des tests, vous pouvez utiliser ActivityLifecycleMonitorRegistry: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/Java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.Java#L15
1
Sebas LG

Si enracinée:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
0
nafsaka

fermer l'application

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

mettez ceci dans oncreate et onResume de la toute première activité qui est ouverte ... est sur l'activité de l'écran de démarrage

if (getIntent().getBooleanExtra("EXIT", false)) {
            this.finish();
            System.exit(0);
        }
0

Vous pouvez utiliser la méthode finishAffinity() pour terminer l'activité en cours et toutes les activités parent. Mais cela ne fonctionne que pour API 16+.

Utilisation de l'API 16+:

finishAffinity();

Ci-dessous l'utilisation de l'API 16:

ActivityCompat.finishAffinity(this); //with v4 support library

Pour quitter l'application entière:

finishAffinity(); // Close all activites
System.exit(0);  // closing files, releasing resources
0
Hasib Akter