Android: Löschen Sie den Backstack


330

In Android habe ich einige Aktivitäten, sagen wir A, B, C.

In A verwende ich diesen Code, um B zu öffnen:

Intent intent = new Intent(this, B.class);
startActivity(intent);

In B verwende ich diesen Code, um C zu öffnen:

Intent intent = new Intent(this, C.class);
startActivity(intent);

Wenn der Benutzer in C auf eine Schaltfläche tippt, möchte ich zu A zurückkehren und den hinteren Stapel löschen (B und C schließen). Wenn der Benutzer die Zurück-Taste B und C nicht anzeigt, habe ich Folgendes versucht:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

Aber B und C werden immer noch angezeigt, wenn ich die Zurück-Taste benutze, wenn ich wieder in Aktivität A bin. Wie kann ich das vermeiden?

Antworten:


437

Versuchen Sie, FLAG_ACTIVITY_NEW_TASKwie in den Dokumenten beschrieben hinzuzufügen FLAG_ACTIVITY_CLEAR_TOP:

Dieser Startmodus kann auch in Verbindung mit FLAG_ACTIVITY_NEW_TASK effektiv verwendet werden: Wenn er zum Starten der Stammaktivität einer Aufgabe verwendet wird, wird jede aktuell ausgeführte Instanz dieser Aufgabe in den Vordergrund gerückt und anschließend in ihren Stammzustand gelöscht. Dies ist beispielsweise besonders nützlich, wenn Sie eine Aktivität über den Benachrichtigungsmanager starten.

Ihr zu startender Code Awäre also:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.

28
Danke, aber ich habe es versucht. Immer noch, wenn ich auf die Zurück-Taste tippe, nachdem wieder C angezeigt wird. Was kann ich vermissen?
Martin

4
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
Dzeikei

8
funktioniert bei mir nicht, aber das Aufrufen von finish () für die
Quellaktivität

10
Ich hatte das gleiche Problem, dass dies nicht funktionierte. Was es für mich behoben hat, war, nach dem Start der neuen Aktivität finish () aufzurufen
Arno

20
Ich habe auch eine weitere eindeutige Absichtsabsicht hinzugefügt = neue Absicht (SingUpActivity.this, LoginActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (Absicht); Fertig();
Sam

146
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

8
Bei allem Respekt vor der CLEAR_TOPFlagge - diese Kombination ist die EINZIGE, die den gesamten Stapel vollständig gelöscht und die neue Aktivität zur einzigen in der App gemacht hat. Vielen Dank!
Aviel Gross

8
Was ist der Unterschied zwischen dieser und der akzeptierten Antwort?
Yuri Heupa

7
Vielen Dank, der Unterschied zu der akzeptierten Antwort besteht darin, dass wir mit dieser Flagge keine Aktivität aufrufen müssen.
Finish

1
FLAG_ACTIVITY_CLEAR_TASK arbeitete perfekt mit NEW_TASK
Shamsul Arefin Sajib

1
Dies sollte die akzeptierte Antwort sein. Vielen Dank.
MD Danish Ansari

77

Was ist mit dem Hinzufügen einer Manifestdatei für verwandte Aktivitäten:

android:noHistory="true"

zur Aktivitätsdefinition von B und C? Sie werden nicht zum Backstack hinzugefügt. Ich bin mir nicht sicher, ob du das willst.


3
Seien Sie dabei sehr vorsichtig - Wenn Sie die Anmeldung mit FB oder einer ähnlichen Funktion verwenden
Skynet

2
@ Skynet Warum? Was sind die damit verbundenen Probleme?
Alfie Woodland

8
Wenn Sie die Steuerung an FB übergeben, um sich von einer Seite mit nohistory als true anzumelden, kann die FB-App nach dem Anmelden des Benutzers nicht mehr landen. In meinem Fall kehrte sie zum Startbildschirm des Telefons zurück und ich verlor fast meinen Job!
Skynet

Dadurch wird keine Aktivität zum Backstack hinzugefügt. Dies ist keine korrekte Lösung.
Tarun

Genau ich suche
Masum

63

Das stört mich lange. Schließlich habe ich es so herausgefunden:

Verwenden Sie im Fragment:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

Verwenden Sie in Aktivität (fügen Sie im Intent.FLAG_ACTIVITY_CLEAR_TASKVergleich zum Fragment ein weiteres Intent-Flag hinzu ):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

1
Wenn Sie Android-Anmerkungen verwenden, müssen Sie hinzufügen: Intent.FLAG_ACTIVITY_CLEAR_TASK
yosafatade

Aktivitätslösung hat bei mir gut funktioniert. Obwohl ich denke, dass mit API 16 die Lösung von Daniel Schuler einfacher ist.
PhilippS

Danke yosafatade, das hat mir gefehlt!
Marty Miller

30
  1. Hinzufügen android:launchMode="singleTop" dem Aktivitätselement in Ihrem Manifest für Aktivität A hinzu
  2. Verwenden Sie dann intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) und intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)beim Starten von Aktivität A.

Dies bedeutet, dass beim Starten von Aktivität A alle darüber liegenden Aufgaben gelöscht werden, sodass A ganz oben steht. Ein neuer Backstack wird mit A im Stammverzeichnis erstellt. Durch die Verwendung wird singleTopsichergestellt, dass Sie A immer nur einmal starten (da A jetzt aufgrund von oben liegt ..._CLEAR_TOP).


3
Ja. Das ist es, was ich jetzt benutze, aber das macht es nicht. Immer noch wird C angezeigt, wenn ich die Zurück-Taste drücke.
Martin

Seltsamerweise habe ich das in einem Projekt verwendet und es funktioniert einwandfrei. Durch Zurückdrücken komme ich zum Startbildschirm. Vielleicht ist noch etwas los. Könnten Sie Ihr Manifest veröffentlichen?
Joseph Earl

Ich habe den Emulator neu gestartet und jetzt scheint er genau so zu funktionieren, wie Sie es gesagt haben. Vielen dank für Deine Hilfe!
Martin

singleTop sollte nichts mit dem Löschen des Stapels zu tun haben.
stdout

29

Ab API 16 (Jelly Bean) können Sie einfach aufrufen finishAffinity() .

Jetzt können Sie auch anrufen ActivityCompat.finishAffinity(Activity activity) mit der Kompatibilitätsbibliothek .

Stellen Sie sicher, dass taskAffinity im Manifest auf einen Paketnamen festgelegt ist, der für diese Gruppe von Aktivitäten eindeutig ist.

Weitere Informationen finden Sie unter:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29


Wirklich benutzerfreundliche und einfache Lösung, wenn Sie bereits mit API 16 vertraut sind. Hat für mich funktioniert!
PhilippS

3
Erinnerung: Dies funktioniert nur für Aktivitäten in derselben Aufgabe. Affinitätsname
Ryan

Dies funktioniert nur, wenn Sie nur eine Aktivität in der Historie haben.
Arsent

17

Versuchen Sie es mit

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

und nicht

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

11

Wenn Ihre Anwendung mindestens SDK-Version 16 hat, können Sie finishAffinity () verwenden.

Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben.

Dies ist Arbeit für mich. Im Bildschirm "Top Payment" entfernen Sie alle Backstack-Aktivitäten.

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29



8

Versuchen Sie diesen Code für zukünftige Forschungen.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

Diese Flaggen haben endlich für mich funktioniert. Ich habe dieselbe Aktivität gestartet, in der ich mich mit diesen Flags und einem booleschen zusätzlichen EXIT = true befand. In onCreate () habe ich die Startparameter für EXIT überprüft und finish () aufgerufen, wenn es auf true gesetzt wurde. Das ist eine Menge Aufwand, nur um Ihre eigene App zu schließen.
Janne Oksanen

8

Verwenden Sie finishAffinity (); in Aufgabe C beim Starten von Aufgabe A, um Backstack-Aktivitäten zu löschen.


Nur diese Antwort funktioniert bei mir. Intent.FLAG_ACTIVITY_CLEAR_TOP und Intent.FLAG_ACTIVITY_NEW_TASK sind nicht erforderlich
nuttynibbles

7

Verwenden Sie diesen Code, um eine neue Aktivität zu starten und alle anderen Aktivitätsstapel oder Rückstapel zu schließen oder zu zerstören.

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

5
Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.

5

Ich habe eine interessante Lösung gefunden, die helfen könnte. Ich habe das in meiner onBackPressed()Methode gemacht.

finishAffinity();
finish();

FinishAffinityEntfernt die Verbindung der vorhandenen Aktivität zu ihrem Stapel. Und dann hilft Ihnen das Beenden, diese Aktivität zu beenden. Welches wird schließlich die Anwendung beenden.


4

Ich fand die Antworten hier etwas irreführend, weil der Code in der ursprünglichen Frage für mich gut zu funktionieren scheint?

Wenn A die Stammaktivität ist und B oder C nur mit FLAG_ACTIVITY_CLEAR_TOP gestartet wird, werden B und C vom Backstack entfernt.


4

In Kotlin ist es fast dasselbe wie in Java. Nur | Symbol wird durch oder Text ersetzt. Also ist es geschrieben wie-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

3

Ich habe alle Lösungen ausprobiert und keine hat individuell für mich gearbeitet. Meine Lösung lautet:

Erklären Sie, Activity Awie SingleTopdurch den Einsatz[android:launchMode="singleTop"] in Android manifestieren.

Fügen Sie nun die folgenden Flags hinzu, während Sie Avon einem beliebigen Ort aus starten . Der Stapel wird gelöscht.

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

2

Intent.FLAG_ACTIVITY_CLEAR_TOPwird in diesem Fall nicht funktionieren. Benutzen Sie bitte(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Weitere Informationen finden Sie in dieser Dokumentation.


2

Es klingt für mich wie Sie brauchen , Activity Caus Activity Bunter Verwendung startActivityForResult(). Wenn Sie auf eine Schaltfläche klicken Activity C, wird der Anruf beendet setResult(RESULT_OK)und finish()damit Activity Cbeendet. In Activity Bkönnten Sie die onActivityResult()Antwort erhalten, indem Sie auch sich selbst anrufen finish(), und Sie würden dann zurück zu Activity A.


7
Ja, aber wenn es zwischen A und C 42 Aktivitäten gibt, ist dies ziemlich langwierig. Das Flag FLAG_ACTIVITY_CLEAR_TOP soll direkt das tun, was das OP will.
Guillaume Brunerie

Dies wäre ein weniger als optimaler Weg, um das zu erreichen, was das OP will, und wie @Guillaume sagte, würde es Code für alle Aktivitäten zwischen der Wurzel und der Oberseite des Stapels erfordern.
Jake Basile

Zur Kenntnis genommen. Dies sind Flaggen, über die ich anscheinend lernen muss.
Maximus

1

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);


1

Sie können dieses Beispiel verwenden, um Ihre Activity Avon anzurufenActivity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


1

Für mich hat das Hinzufügen Intent.FLAG_ACTIVITY_CLEAR_TASKdas Problem gelöst

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();

1

Fortgeschrittenes, wiederverwendbares Kotlin:

Sie können das Flag direkt mit der Setter-Methode setzen. In Kotlin orist der Ersatz für Java bitweise oder |.

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

Wenn Sie dies mehrmals verwenden, erstellen Sie eine Absichtserweiterungsfunktion

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

Sie können diese Funktion dann direkt aufrufen, bevor Sie die Absicht starten

intent.clearStack()

Wenn Sie in anderen Situationen die Option zum Hinzufügen zusätzlicher Flags benötigen, fügen Sie der Erweiterungsfunktion einen optionalen Parameter hinzu.

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

0

Darüber hinaus FLAG_ACTIVITY_CLEAR_TOPkönnen Sie auch Folgendes hinzufügen Intent.FLAG_ACTIVITY_SINGLE_TOP:

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


Dies würde sich nur auf die Aktivität oben im Stapel auswirken, nicht auf die Wurzel.
Jake Basile

0

Der angegebene Code funktioniert korrekt. Ich habe es im Application Life Cycle-Beispiel versucht.

Ich habe B und C nicht im Backstack, nachdem ich Aktivität A mit dem Flag FLAG_ACTIVITY_CLEAR_TOP gestartet habe


0

Ich rief an, activity_name.this.finish()nachdem ich neue Absichten gestartet hatte und es funktionierte für mich.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Aber es wird bei mir nicht funktionieren ... Ich schlage diese Lösung nicht zur Verwendung vor, aber wenn das Setzen des Flags bei Ihnen nicht funktioniert, können Sie dies versuchen. Trotzdem empfehle ich, sie nicht zu verwenden


0

Fügen Sie in der Absicht NO History Flag hinzu.

Starten Sie in Aktivität B die Aktivität C wie folgt >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

0

Im Manifest

android:launchMode="singleTask"

und

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

0

Fügen Sie dies entweder zu Ihrem Activity Bund hinzuActivity C

android:noHistory="true"

oder Override onBackPressedFunktion, um ein Zurückdrücken mit a zu vermeiden return.

@Override
public void onBackPressed() {
   return;
}

0

Verwenden Sie die Methode setFlags (), um die Rückseite zu löschen, alle Aktivitäten zu schließen und Ihre Aktivität zu starten

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
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.