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 ....
putExtra
das
Es gibt eine finishAffinity()
Methode 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();
Verwenden Sie für niedrigere (Android 4.1 niedriger)
ActivityCompat.finishAffinity(YourActivity.this);
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
Verwenden Sie für API 16+
finishAffinity();
Für niedrigere verwenden
ActivityCompat.finishAffinity(YourActivity.this)
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.
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ür API 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
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.
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.
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:
finishAffinity();
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? ...)
Sie können versuchen, einfach finishAffinity () zu beenden, um alle aktuellen Aktivitäten zu schließen, die über Version 4.1 ausgeführt werden
Das Problem dabei 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 anschließend in den Vordergrund gestellt werden finishAffinity()
. 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#L15Sie 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.
Verwenden
finishAffinity ();
Anstatt von:
System.exit(); or finish();
Es beendet die vollständige Anwendung oder alle Aktivitäten.
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);
}
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();
}
moveTaskToBack (true);
// füge dies dem Klicklistener hinzu
@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();
}
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();
}