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

20voto

Smiderle Punkte 447

Ich verwende diesen Weg.

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

8voto

alphonzo79 Punkte 788

Ich weiß, ich bin spät dran (es ist zwei Jahre her, dass die Frage gestellt wurde), aber ich habe es geschafft, indem ich das Drücken der Zurück-Taste abgefangen habe. Anstatt nach bestimmten Aktivitäten zu suchen, schaue ich einfach auf die Anzahl und wenn es weniger als 3 sind, schickt es die App einfach zurück (pausiert die App und bringt den Benutzer zu dem zurück, was vor dem Start lief). Ich prüfe auf weniger als drei, weil ich nur einen Startbildschirm habe. Außerdem überprüfe ich die Anzahl, weil meine App es dem Benutzer ermöglicht, über das Menü zurück zum Startbildschirm zu navigieren, so dass er wie gewohnt durch andere Bildschirme zurückgehen kann, wenn es andere Aktivitäten als den Startbildschirm auf dem Stapel gibt.

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it's more than two deep (initial screen and home screen)
    //If it's more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}

8voto

Anubhav Punkte 1636

Im Manifest können Sie hinzufügen:

android:noHistory="true"

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

Sie können auch anrufen

finish()

unmittelbar nach dem Aufruf von startActivity(..)

6voto

Einfach einstellen noHistory="true" sur Manifest Datei. Es macht Aktivität aus dem Backstack entfernt werden.

4voto

Otieno Rowland Punkte 2054

Es ist verrückt, dass niemand diese elegante Lösung erwähnt hat. Dies sollte die akzeptierte Antwort sein.

SplashActivity -> AuthActivity -> DashActivity

if (!sessionManager.isLoggedIn()) {
    Intent intent = new Intent(context, AuthActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    context.startActivity(intent);
    finish();
} else {
   Intent intent = new Intent(context, DashActivity.class);
   context.startActivity(intent);
    finish();
}

Der Schlüssel dazu ist die Verwendung von intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); für den Vermittler Activity . Sobald diese mittlere Verbindung unterbrochen ist, wird die DashActivity der erste und der letzte im Stapel sein.

android:noHistory="true" ist eine schlechte Lösung, da sie Probleme verursacht, wenn man sich auf die Activity als Rückruf, z. B. onActivityResult . Dies ist die empfohlene Lösung und sollte akzeptiert werden.

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