Beenden Sie alle Aktivitäten gleichzeitig


70

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?


1
Können Sie Ihre App / Ihr Szenario genauer beschreiben? Das gleichzeitige Schließen aller Aktivitäten ist normalerweise nicht erforderlich.
Fhucho

Antworten:


132

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


1
Mit diesem Code funktioniert Ihre Schaltfläche "Zurück" jedoch nicht mehr wie gewohnt. Es wird alles geschlossen, wenn Sie auf "Zurück" klicken. Wie soll man damit umgehen / @letsnurture?
Gumuruh

Was macht putExtradas
Benutzer

1
@letsnurture Aktivität bleibt in der Liste der letzten Apps
Erum

1
Was kann beim Starten des Formularempfängers getan werden? Ich habe das gleiche versucht, was Sie vorschlagen, aber es funktioniert nicht ... irgendein Vorschlag?
CoDe

2
Intent intent = new Intent (getApplicationContext (), LoginActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity (Absicht);
Dante

71

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

4
Verwenden Sie für ältere Versionen von Android ActivityCompat#finishAffinity().
Pang

23

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


schön, das ist das beste
lacas

Arbeiten super ... Danke
Surendar D

22

Verwenden Sie für API 16+

finishAffinity();

Für niedrigere verwenden

ActivityCompat.finishAffinity(YourActivity.this)

1
Darf ich Sie bitten, Ihrer Antwort einen weiteren Kontext hinzuzufügen. Nur-Code-Antworten sind schwer zu verstehen. Es wird sowohl dem Fragesteller als auch zukünftigen Lesern helfen, wenn Sie Ihrem Beitrag weitere Informationen hinzufügen können.
RBT

12

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.


2
system.exit (0) zum Beenden der Anwendung: Perfekt zum Schließen Aktivität von Broadcastreceiver
Akarsh M

Dies führt jedoch dazu, dass der Aktivitätsverlauf nicht zum Stapel hinzugefügt wird, wodurch die Aktivität jedes Mal neu
gestartet wird,

11

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

Bitte posten Sie keine identischen Antworten auf mehrere Fragen. Veröffentlichen Sie eine gute Antwort und stimmen Sie ab, um die anderen Fragen als Duplikate zu schließen. Wenn die Frage kein Duplikat ist, passen Sie Ihre Antworten auf die Frage an.
Paul Roub

9

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.


7

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.


6

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();


Beendet dies ALLE Aktivitäten ...? Oder nur die aktuelle Aktivität?
GyuHyeon Choi

Alle Aktivitäten laufen wegen App.
Himanshu Sharma

4

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


3

Sie können versuchen, einfach finishAffinity () zu beenden, um alle aktuellen Aktivitäten zu schließen, die über Version 4.1 ausgeführt werden


3

Das Problem dabei finishAffinity()ist, dass nur Aktivitäten in Ihrer aktuellen Aufgabe geschlossen werden, Aktivitäten mit singleInstancelaunchMode 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 :

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

Dies scheint die beste Antwort zu sein
Laimiux

beste Antwort heutzutage dank Lebenszyklus-Aktivitäten, keine Notwendigkeit für die Kontrolle über ihren Zustand oder Absichten
lukassos

1

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.


Vielen Dank für Ihren Ansatz, es hat mir geholfen. Ich habe etwas Ähnliches mit einer statischen Klassenvariablen anstelle von gemeinsamen Einstellungen gemacht, die die gesamte Lebensdauer der App überlebt. Rufen Sie in onResume jeder Aktivität super.onResume () auf. if (ExitHelper.isExitFlagRaised) {this.finish (); }. Während möglicherweise nicht ALLE Aktivitäten abgeschlossen werden, werden Aktivitäten beendet, die automatisch fortgesetzt werden.
Kevin Lee

1

Verwenden

finishAffinity ();

Anstatt von:

System.exit(); or finish();

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


1

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

Wenn verwurzelt:

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

0

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);
        }

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();
    }


0
@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();
    }

-9

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();
    }

2
Halten Sie niemals statische Verweise auf Aktivitäten. Aktivitäten verbrauchen relativ viel Speicher, der freigegeben werden sollte, wenn Aktivitäten in den Hintergrund treten. statische Referenzen werden so lange gespeichert, wie der Prozess aktiv ist, was anwendungsmäßig für immer bedeutet. Es ist sowohl schlecht für Sie als Entwickler als auch für den Benutzer.
Pijusn

Globale Variablen sind schwerwiegende Antimuster.
Ezaquarii

Furchtbar. Darf niemals einen globalen Verweis auf eine Aktivität behalten.
PerracoLabs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.