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?

Martin
quelle

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.
Jake Basile
quelle
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);
Diesel
quelle
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.

Dominik Helleberg
quelle
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);
Geng Jiawen
quelle
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).

Joseph Earl
quelle
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

Daniel Schuler
quelle
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);
Muhammad Aamir Ali
quelle
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

Jaydeep purohit
quelle
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();
GeetT
quelle
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.

baswaraj
quelle
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);
Pankaj Talaviya
quelle
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.
Firzan Shaikh
quelle
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.

Sujith Royal
quelle
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.

ianjoyner
quelle
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)
Exigente05
quelle
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();
Tarun
quelle
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.

Ashish Saini
quelle
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.

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

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

Vipin Yadav
quelle
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();
Mohamed Mo'nes
quelle
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
}
Gibolt
quelle
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);

James
quelle
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

Sathesh
quelle
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

Swap-IOS-Android
quelle
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();
Arun Sharma
quelle
0

Im Manifest

android:launchMode="singleTask"

und

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Blackjack
quelle
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;
}
Renjith JR
quelle
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);
Pankaj Talaviya
quelle