364 Stimmen

Android: Den hinteren Stapel löschen

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 auf eine Schaltfläche in C tippt, möchte ich zu A zurückkehren und den hinteren Stapel löschen (sowohl B als auch C schließen). Also, wenn der Benutzer die Zurück-Taste B und C wird nicht angezeigt, ich habe versucht, die folgenden:

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.

480voto

jakebasile Punkte 7884

Versuchen Sie FLAG_ACTIVITY_NEW_TASK wie in den Dokumenten für FLAG_ACTIVITY_CLEAR_TOP :

Dieser Startmodus kann auch verwendet werden, um gute Wirkung in Verbindung mit FLAG_ACTIVITY_NEW_TASK: wenn verwendet, um die Root-Aktivität einer Aufgabe zu starten, bringt er wird jede derzeit laufende Instanz dieses Tasks in den in den Vordergrund und setzt sie dann in ihren Root-Zustand. Dies ist besonders nützlich, zum Beispiel beim Starten einer Aktivität aus dem Benachrichtigungs Manager.

Ihr Code zum Starten von A wäre:

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.

186voto

diesel Punkte 3136
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

82voto

Dominik Helleberg Punkte 994

Was ist mit dem Hinzufügen in der Manifestdatei für die entsprechende Aktivität?

android:noHistory="true"

zur Tätigkeitsdefinition von B und C ? Sie werden nicht zum Backstack hinzugefügt. Ich bin nicht sicher, ob Sie das wollen.

65voto

Geng Jiawen Punkte 8050

Das hat mich lange Zeit gestört, und schließlich habe ich es mit dieser Methode gelöst:

In Fragment, verwenden:

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 Activity(fügen Sie ein weiteres Absichtsflag hinzu Intent.FLAG_ACTIVITY_CLEAR_TASK im Vergleich zum Fragment):

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

35voto

Daniel Schuler Punkte 3032

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

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

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

Siehe für weitere Informationen:
http://developer.Android.com/reference/Android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X