webentwicklung-frage-antwort-db.com.de

Beenden Sie alle Aktivitäten auf einmal

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?

52
steve

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 ....

116
letsnurture

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);
53
King of Masses

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

22
Mongi Zaidi

Verwenden Sie für API 16+

finishAffinity();

Für niedriger verwenden

ActivityCompat.finishAffinity(YourActivity.this)
17
Radu Grigoras

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.

11
Dipak Keshariya

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.

9
TheOddAbhi

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? ...)

3
user3139591

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. 

3
Ajji

Sie können es einfach mit finishAffinity () versuchen, es schließt alle aktuellen Aktivitäten ab Version 4.1

2
Vinodh Kumar

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.

2
Himanshu Sharma

Benutzen 

finishAffinity ();

Anstatt:

System.exit(); or finish();

es beendet die vollständige Anwendung oder alle Aktivitäten.

1
Anandhu Vijayan

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.

1
Dmila Ram

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:

  1. Verwenden Sie 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-L10
  2. Beim Testen können Sie ActivityLifecycleMonitorRegistry: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/Java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.Java#L15 verwenden.
1
Sebas LG

Wenn verwurzelt:

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

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);
0
Enad

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
0
Hasib Akter