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?
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 ....
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);
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.
Pour API 16+, utilisez
finishAffinity();
Pour les bas, utilisez
ActivityCompat.finishAffinity(YourActivity.this)
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.
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.
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? ...)
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.
Vous pouvez essayer juste finishAffinity (), sa fermeture toutes les activités en cours pour travailler dessus
Utilisation
finishAffinity ();
Au lieu de:
System.exit(); or finish();
il quitte l'application complète ou toute activité.
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.
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}:
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-L10ActivityLifecycleMonitorRegistry
: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/Java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.Java#L15Si enracinée:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
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);
}
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