Ich habe eine Anwendung mit mehreren Seiten, dh mehreren Aktivitäten, und einige davon bleiben offen.
Gibt es eine Möglichkeit, alle Aktivitäten gleichzeitig zu schließen?
Ich habe eine Anwendung mit mehreren Seiten, dh mehreren Aktivitäten, und einige davon bleiben offen.
Gibt es eine Möglichkeit, alle Aktivitäten gleichzeitig zu schließen?
Antworten:
Wenn Sie alle geöffneten Aktivitäten beenden möchten, sollten Sie eine Schaltfläche drücken, die die erste Aktivität lädt , die beim Start Ihrer Anwendung ausgeführt wird. Löschen Sie dann alle anderen Aktivitäten und beenden Sie die letzte verbleibende Aktivität. 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);
Der obige Code beendet alle Aktivitäten mit Ausnahme von FirstActivity. Dann müssen wir die FirstActivity beenden. Geben Sie den folgenden Code in die Oncreate von Firstactivity ein
if (getIntent().getBooleanExtra("EXIT", false)) { finish(); }
und du bist fertig ....
quelle
putExtra
dasEs gibt eine
finishAffinity()
MethodeActivity
, 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();
Verwenden Sie für niedrigere (Android 4.1 niedriger)
ActivityCompat.finishAffinity(YourActivity.this);
quelle
ActivityCompat#finishAffinity()
.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
quelle
Verwenden Sie für API 16+
finishAffinity();
Für niedrigere verwenden
ActivityCompat.finishAffinity(YourActivity.this)
quelle
Es gibt drei Lösungen für eine eindeutige Aktivitätshistorie.
1) Sie können
finish()
zum Zeitpunkt des Starts einer neuen Aktivität absichtlich schreiben .2) Schreiben Sie
android:noHistory="true"
alle<activity>
Tags in die Datei Androidmanifest.xml. Verwenden Sie diese Option, wenn Sie eine neue Aktivität geöffnet haben und zu diesem Zeitpunkt nicht finish () schreiben. Die vorherige Aktivität ist immer beendet. Nach dem Schreiben sieht Ihre Aktivität folgendermaßen aus.<activity android:name=".Splash_Screen_Activity" android:label="@string/app_name" android:noHistory="true"> </activity>
3) Schreiben Sie
system.exit(0)
zum Beenden der Anwendung.quelle
Sie können eine
finishAffinity()
Methode verwenden, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden. Aber es funktioniert nur fürAPI 16+
.API 16+ verwenden:
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
quelle
Ich hatte mit dem gleichen Problem zu kämpfen. Das Öffnen der About-Seite und das Aufrufen
finish();
von dort aus führte nicht zum Schließen der App, sondern zur vorherigen Aktivität, und ich wollte die App über die About-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.
quelle
Die folgenden zwei Flaggen haben bei mir funktioniert. Sie werden alle vorherigen Aktivitäten löschen und eine neue starten
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.
quelle
Keine der anderen Antworten hat bei mir 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 also folgenden Code hinzu:
quelle
Wenn Sie nach einer Lösung suchen, die "nach dem Vorbild" und methodisch (mit einem BroadcastReceiver) gestaltet zu sein scheint, schauen Sie sich besser den folgenden Link an: http://www.hrupin.com/2011/10 / Wie man alle Aktivitäten in seiner Android-Anwendung durch einen einfachen Anruf beendet .
In der vorgeschlagenen Implementierung, die in diesem Link angezeigt wird, ist eine geringfügige Änderung erforderlich. Verwenden Sie die Methode sendStickyBroadcast (Intent) (vergessen Sie nicht, Ihrem Manifest die Berechtigung BROADCAST_STICKY hinzuzufügen) anstelle von sendBroadcast (Intent), um Ihre zu aktivieren Aktivitäten angehalten, um die Sendung empfangen und verarbeiten zu können. Dies bedeutet, dass Sie diese Sticky-Sendung auch entfernen müssen, während Sie Ihre Anwendung neu starten, indem Sie die Methode removeStickyBroadcast (Intent) in der onCreate () -Methode Ihrer öffnenden Aktivität aufrufen.
Obwohl die oben genannten startActivity (...) -basierten Lösungen auf den ersten Blick sehr nett, elegant, kurz, schnell und einfach zu implementieren scheinen, fühlen sie sich ein bisschen "falsch" (um eine Aktivität zu starten - mit allem Möglichen Overhead und Ressourcen, die möglicherweise erforderlich und damit verbunden sind, nur um es zu töten? ...)
quelle
Sie können versuchen, einfach finishAffinity () zu beenden, um alle aktuellen Aktivitäten zu schließen, die über Version 4.1 ausgeführt werden
quelle
Das Problem dabei
finishAffinity()
ist, dass nur Aktivitäten in Ihrer aktuellen Aufgabe geschlossen werden, Aktivitäten mitsingleInstance
launchMode und in anderen Aufgaben jedoch weiterhin geöffnet und anschließend in den Vordergrund gestellt werdenfinishAffinity()
. Das Problem mitSystem.exit(0)
ist, dass Sie Ihren App-Prozess mit allen Hintergrunddiensten und dem gesamten zugewiesenen Speicher beenden. Dies kann zu unerwünschten Nebenwirkungen führen (z. B. wenn Sie keine Benachrichtigungen mehr erhalten).Hier sind zwei weitere Alternativen, die beide Probleme lösen :
ActivityLifecycleCallbacks
Sie in Ihrer App-Klasse, um erstellte Aktivitäten zu registrieren und bei Bedarf zu schließen: 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#L15quelle
Sie können ein boolesches Flag speichern, um darzustellen, ob alle Aktivitäten beendet werden sollen oder nicht (in Ihren gemeinsamen Einstellungen bevorzugter). Die
onStart()
Methode jeder Aktivität sollte Folgendes haben:SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this); boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false); if(needToDestroyFlag) { finish(); }else { //... }
Natürlich können Sie dieses Flag wie unten setzen, wann immer Sie alle Aktivitäten (in der aktuellen Aktivität) beenden müssen, nachdem Sie dies getan haben. Sie können die Methode finish () für die aktuelle Aktivität aufrufen, die dazu führt, dass die aktuellen Aktivitäten und Pop-Aktivitäten nacheinander beendet werden Zum einen wird die onStart () -Methode von jedem ausgeführt und veranlasst, sie zu beenden:
SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putBoolean("destroyFlag", true); editor.apply();
Wenn Sie die von @letsnurture vorgeschlagene Methode verwenden, werden Sie mit der von @gumuruh gestellten Frage konfrontiert.
quelle
Verwenden
finishAffinity ();
Anstatt von:
System.exit(); or finish();
Es beendet die vollständige Anwendung oder alle Aktivitäten.
quelle
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);
quelle
Wenn verwurzelt:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
quelle
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);
Fügen Sie dies in oncreate und onResume der allerersten Aktivität ein, die geöffnet wird. Ex. ist auf dem Begrüßungsbildschirm aktiv
if (getIntent().getBooleanExtra("EXIT", false)) { this.finish(); System.exit(0); }
quelle
in LoginActivity @Override public void onBackPressed() { Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); finish(); super.onBackPressed(); }
quelle
moveTaskToBack (true);
// füge dies dem Klicklistener hinzu
quelle
@Override public void onBackPressed(){ MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(BorrowForm.this, MyTheme); alert.setTitle("Confirmation"); alert.setCancelable(false); alert.setMessage("App will exit. Data will not be saved. Continue?"); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast toast = Toast.makeText(BorrowForm.this, "App terminated.", Toast.LENGTH_SHORT); toast.getView().setBackgroundColor(Color.parseColor("#273036")); toast.setGravity(Gravity.CENTER_HORIZONTAL,0,0); TextView toastMessage=(TextView) toast.getView().findViewById(android.R.id.message); toastMessage.setTextColor(Color.WHITE); toast.show(); finishAffinity(); } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); alert.setCancelable(false); alert.show(); }
quelle
Ich bin Starter in Java / Android, kann diese einfache Lösung Hilfe für Sie sein
FIRST , erstellen statische Klasse
public class ActivityManager { static Activity _step1; static Activity _step2; static Activity _step3; public static void setActivity1(Activity activity) { _step1 = activity; } public static void setActivity2(Activity activity) { _step2 = activity; } public static void setActivity3(Activity activity) { _step3 = activity; } public static void finishAll() { _step1.finish(); _step2.finish(); _step3.finish(); } }
DANN, wenn Sie eine neue Aktivität ausführen, speichern Sie den Link zu Ihrem Manager (in Schritt 1):
ActivityManager.setActivity1(this); AddValuesToSharedPreferences(); Intent intent = new Intent(Step1.this, Step2.class); startActivity(intent);
UND DANN beenden Sie in Ihrem letzten Schritt alle:
public void OkExit(View v) throws IOException { ActivityManager.finishAll(); }
quelle