Ich habe eine Anwendung mit mehreren Seiten, d. H. Mehreren Aktivitäten, und einige davon bleiben offen.
Gibt es eine Möglichkeit, alle Aktivitäten auf einmal zu schließen?
Wenn Sie alle geöffneten Aktivitäten beenden möchten, müssen Sie eine Taste drücken, die die erste Aktivität lädt, die ausgeführt wird, wenn Ihre Anwendung gestartet wird. Alle anderen Aktivitäten werden gelöscht. Wenden Sie dazu den folgenden Code in Ihrem Projekt an
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
Mit dem obigen Code werden alle Aktivitäten mit Ausnahme von FirstActivity abgeschlossen. Dann müssen wir die FirstActivity's beenden Geben Sie den folgenden Code in Firstactivitys oncreate ein
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
und du bist fertig ....
Es gibt eine finishAffinity()
-Methode in Activity
, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden, sie funktioniert jedoch nur in Android 4.1 oder höher.
Verwenden Sie für API 16+
finishAffinity();
Für niedrigere (Android 4.1 niedriger) verwenden Sie
ActivityCompat.finishAffinity(YourActivity.this);
Die beste Lösung, die ich gefunden habe, ist kompatibel mit Geräten mit API-Level <11
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Diese Lösung erfordert eine Android-Unterstützungsbibliothek
Verwenden Sie für API 16+
finishAffinity();
Für niedriger verwenden
ActivityCompat.finishAffinity(YourActivity.this)
Es gibt drei Lösungen für einen klaren Aktivitätsverlauf.
1) Sie können finish()
zum Zeitpunkt des Beginns einer neuen Aktivität durch Absicht schreiben.
2) Schreiben Sie Android:noHistory="true"
in alle <activity>
-Tags in die Datei Androidmanifest.xml. Verwenden Sie diese Option, wenn Sie eine neue Aktivität öffnen und nicht fertig stellen (). Zu diesem Zeitpunkt ist die vorherige Aktivität immer beendet, nachdem Sie Ihre Aktivität so aussehen.
<activity
Android:name=".Splash_Screen_Activity"
Android:label="@string/app_name"
Android:noHistory="true">
</activity>
3) Schreiben Sie system.exit(0)
, um die Anwendung zu beenden.
Ich hatte mit dem gleichen Problem zu kämpfen. Beim Öffnen der Info-Seite und dem Aufruf von finish();
von dort aus wurde die App nicht geschlossen. Stattdessen wurde eine vorherige Aktivität ausgeführt, und ich wollte die App von der Info-Seite selbst schließen.
Dies ist der Code, der für mich funktioniert hat:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
Hoffe das hilft.
Wenn Sie nach einer Lösung suchen, die scheinbar "nach dem Buch" zu sein scheint und methodisch (mit einem BroadcastReceiver) entworfen wurde, schauen Sie sich bitte den folgenden Link an: http://www.hrupin.com/2011/10/Wie erledige ich alle Aktivitäten in Ihrer Android-Anwendung durch einfachen Aufruf .
An der vorgeschlagenen Implementierung, die in diesem Link angezeigt wird, ist eine geringfügige Änderung erforderlich. Sie sollten die sendStickyBroadcast (Intent) -Methode verwenden (vergessen Sie nicht, die BROADCAST_STICKY-Berechtigung zu Ihrem Manifest hinzuzufügen), anstatt sendBroadcast (Intent) zu aktivieren Sie haben pausierte Aktivitäten, um den Broadcast empfangen und verarbeiten zu können. Dies bedeutet, dass Sie diesen störenden Broadcast auch entfernen sollten, während Sie Ihre Anwendung neu starten, indem Sie die removeStickyBroadcast (Intent) -Methode in der onCreate () -Methode Ihrer Eröffnungsaktivität aufrufen.
Obwohl die oben genannten auf StartActivity (...) basierenden Lösungen auf den ersten Blick sehr nett wirken, elegant, kurz, schnell und einfach zu implementieren sind, fühlen sie sich etwas "falsch" (um eine Aktivität zu beginnen) - mit allem, was möglich ist Gemeinkosten und Ressourcen, die erforderlich sein könnten, um sie zu töten? ...)
Zwei Flaggen funktionierten für mich. Sie werden alle löschen die vorherigen Aktivitäten und eine neue beginnen
Intent intent = new Intent(getApplicationContext(), MyDetails.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Hoffe das hilft.
Sie können es einfach mit finishAffinity () versuchen, es schließt alle aktuellen Aktivitäten ab Version 4.1
Keine der oben genannten Antworten hat für mich funktioniert. Aber ich recherchierte weiter und bekam endlich die Antwort.
Sie haben tatsächlich darum gebeten, die App nach Bedarf zu schließen. Fügen Sie daher den folgenden Code hinzu
finishAffinity();
Ich hoffe das wird euch helfen.
Benutzen
finishAffinity ();
Anstatt:
System.exit(); or finish();
es beendet die vollständige Anwendung oder alle Aktivitäten.
Sie können ein boolesches Flag speichern, um darzustellen, ob alle Aktivitäten beendet werden sollen oder nicht (bevorzugt in Ihren gemeinsamen Einstellungen). Die onStart()
-Methode jeder Aktivität sollte etwa Folgendes aufweisen:
SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
finish();
}else
{
//...
}
Natürlich können Sie dieses Flag wie folgt setzen, wenn Sie alle Aktivitäten (in der aktuellen Aktivität) beenden müssen, nachdem Sie dies getan haben. Sie können die finish () -Methode für die aktuelle Aktivität aufrufen, die dazu führt, dass die aktuellen Aktivitäten abgebrochen werden und die Aktivitäten nacheinander von einem Stapel aus auftauchen Eine davon führt die onStart () -Methode aus und führt zum Abbruch:
SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();
Wenn Sie die von @letsnurture vorgeschlagene Methode verwenden, werden Sie vor die Frage gestellt, die @gumuruh gestellt hat.
Problem mit finishAffinity()
ist, dass nur Aktivitäten in Ihrer aktuellen Aufgabe geschlossen werden, Aktivitäten mit singleInstance
launchMode und in anderen Aufgaben jedoch weiterhin geöffnet und nach finishAffinity()
in den Vordergrund gebracht werden. Das Problem bei System.exit(0)
ist, dass Sie Ihren App-Prozess mit allen Hintergrunddiensten und dem zugewiesenen Speicher beenden. Dies kann zu unerwünschten Nebeneffekten führen (z. B., dass Sie keine Benachrichtigungen mehr erhalten).
Hier sind weitere zwei Alternativen, die beide Probleme lösen:
ActivityLifecycleCallbacks
in Ihrer App-Klasse, um erstellte Aktivitäten zu registrieren, und schließen Sie sie bei Bedarf: 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#L15 verwenden.Wenn verwurzelt:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
Sie können den folgenden Code verwenden:
Intent i = new Intent(OldActivity.this, NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
schließen Sie die App
Intent intent = new Intent(getApplicationContext(), Splash_Screen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
geben Sie dies in die Felder oncreate und onResume .__ der ersten geöffneten Aktivität ein ex. ist auf dem Startbildschirm aktiv
if (getIntent().getBooleanExtra("EXIT", false)) {
this.finish();
System.exit(0);
}
Sie können die Methode finishAffinity()
verwenden, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden. Aber es funktioniert nur für API 16+
.
API 16+ Verwendung:
finishAffinity();
Unter API 16 verwenden:
ActivityCompat.finishAffinity(this); //with v4 support library
So beenden Sie die gesamte App:
finishAffinity(); // Close all activites
System.exit(0); // closing files, releasing resources