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.

5voto

Gibolt Punkte 32347

Fortgeschrittenes, wiederverwendbares Kotlin:

Sie können das Kennzeichen direkt mit der Methode setter setzen. In Kotlin or es el Ersatz für die Java-Bitwise- oder | .

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

Wenn Sie dies mehr als einmal verwenden, erstellen Sie eine Intent-Erweiterungsfunktion

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 den Intent starten

intent.clearStack()

Wenn Sie die Möglichkeit benötigen, in anderen Situationen zusätzliche Flaggen hinzuzufügen, 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
}

4voto

ianjoyner Punkte 81

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

Wenn A die Root-Aktivität ist, werden beim Starten von B oder C mit FLAG_ACTIVITY_CLEAR_TOP B und C aus dem Backstack entfernt.

4voto

Maximus Punkte 8271

Für mich klingt das so, als müssten Sie damit beginnen Activity C de Activity B durch die Verwendung von startActivityForResult() . Wenn Sie auf eine Schaltfläche in Activity C anrufen setResult(RESULT_OK) y finish() also Activity C beendet ist. Unter Activity B können Sie die onActivityResult() reagieren, indem sie ebenfalls anrufen finish() auf sich selbst, und Sie würden dann zurück zu Activity A .

3voto

Ashish Saini Punkte 2250

Intent.FLAG_ACTIVITY_CLEAR_TOP wird in diesem Fall nicht funktionieren. Bitte verwenden Sie (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Weitere Einzelheiten finden Sie unter este Dokumentation.

3voto

Tarun Deep Attri Punkte 7216

Ich habe alle Lösungen ausprobiert, aber keine hat bei mir funktioniert. Meine Lösung ist:

Erklären Sie Activity A como SingleTop durch die Verwendung von [android:launchMode="singleTop"] im Android-Manifest.

Fügen Sie nun beim Starten die folgenden Flags hinzu A von überall her. Damit wird der Stapel geleert.

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

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