402 Stimmen

Entfernen einer Aktivität aus dem Verlaufsstapel

Meine App zeigt eine Anmeldeaktivität an, wenn der Benutzer die App zum ersten Mal aufruft; das sieht so aus:

  1. ActivitySplashScreen (Willkommen im Spiel, Anmeldung für ein Konto?)
  2. ActivitySplashScreenSignUp (großartig, geben Sie diese Informationen ein)
  3. ActivityGameMain (Hauptbildschirm des Spiels)

so dass die Aktivitäten in genau dieser Reihenfolge gestartet werden, wenn der Benutzer eine Schaltfläche auf jedem Bildschirm anklickt.

Wenn der Benutzer von Aktivität Nr. 2 zu Aktivität Nr. 3 übergeht, ist es dann möglich, Nr. 1 und Nr. 2 vollständig aus dem Verlaufsstapel zu löschen? Ich möchte, dass der Benutzer, wenn er bei Aktivität Nr. 3 ist und auf die Schaltfläche "Zurück" drückt, zum Startbildschirm und nicht zum Startbildschirm zurückkehrt.

Ich denke, ich kann dies mit Aufgaben erreichen (z. B. eine neue Aufgabe auf # 3 starten), wollte aber sehen, ob es eine einfachere Methode gibt,

Danke

668voto

Aitor Gómez Punkte 7267

Sie können dies erreichen, indem Sie die Option android:noHistory Attribut a "true" in der jeweiligen <activity> Einträge in Ihrem AndroidManifest.xml Datei. Zum Beispiel:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

139voto

Dan Lew Punkte 83507

Sie können die Weiterleitung verwenden, um die vorherige Aktivität aus dem Aktivitätsstapel zu entfernen und gleichzeitig die nächste Aktivität zu starten. Ein Beispiel dafür findet sich in den APIDemos aber im Grunde ist alles, was Sie tun, das Aufrufen von finish() unmittelbar nach dem Aufruf von startActivity() .

55voto

Matthias Punkte 42368

Ja, schauen Sie mal unter Intent.FLAG_ACTIVITY_NO_HISTORY .

25voto

Travis Punkte 3679

Dies ist wahrscheinlich nicht der ideale Weg. Wenn jemand einen besseren Weg kennt, würde ich mich freuen, ihn umzusetzen. So geht's I diese spezielle Aufgabe mit der Vorversion 11 des SDK erfüllt.

in jeder Klasse, in der du weggehen willst, wenn es Zeit zum Aufräumen ist, musst du dies tun:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

dann muss derjenige, der die Kette von Pops vom Stapel auslösen muss, nur dies aufrufen, wenn Sie es initiieren wollen:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Dann sind die Aktivitäten nicht auf dem Stapel!
Denken Sie daran, dass Sie eine Aktivität starten und dann mit dem Aufräumen beginnen können, die Ausführung folgt nicht einem einzigen (dem UI-)Thread.

23voto

mxcl Punkte 25282

Eine Möglichkeit, die vor API 11 funktioniert, besteht darin, die ActivityGameMain zuerst, dann in der onCreate dieser Aktivität starten Sie Ihre ActivitySplashScreen Aktivität. Die Website ActivityGameMain wird nicht angezeigt, da Sie startActivity zu früh für das Splash aufrufen.

Dann werden Sie kann beim Starten den Stapel leeren ActivityGameMain durch Setzen dieser Flags auf dem Intent:

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

Sie müssen dies auch zu ActivitySplashScreen hinzufügen:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Damit das Zurückdrücken dieser Aktivität nicht wieder zu Ihrem ActivityGameMain .

Ich nehme an, Sie wollen auch nicht, dass der Startbildschirm zurückgeht, deshalb schlage ich vor, ihn auf noHistory in Ihrem AndroidManifest.xml . Dann legen Sie die goBackPressed Code in Ihrem ActivitySplashScreenSignUp Klasse statt.

Ich habe jedoch einige Möglichkeiten gefunden, dies zu umgehen. Starten Sie eine andere App aus einer Benachrichtigung heraus, während ActivitySplashScreenSignUp wird angezeigt und die Historie wird nicht zurückgesetzt.

Die einzige wirkliche Möglichkeit, dies zu umgehen, ist API 11:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

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