374 Stimmen

Löschen Sie den gesamten Verlaufsstapel und starten Sie eine neue Aktivität auf Android

Ist es möglich, eine Aktivität auf dem Stapel zu starten und den gesamten Verlauf davor zu löschen?

Die Situation

Ich habe einen Aktivitätsstapel, der entweder A->B->C oder B->C umfasst (Bildschirm A wählt den Token des Benutzers aus, aber viele Benutzer haben nur einen einzigen Token).

In Bildschirm C kann der Benutzer Mai eine Aktion durchführen, durch die Bildschirm B ungültig wird, so dass die Anwendung sie zu Bildschirm A bringen will, unabhängig davon, ob dieser bereits auf dem Stapel liegt. Bildschirm A sollte dann das einzige Element auf dem Stapel in meiner Anwendung sein.

Anmerkungen

Es gibt noch viele andere ähnliche Fragen, aber ich habe nichts gefunden, was genau diese Frage beantwortet. Ich habe versucht, anzurufen getParent().finish() - führt dies immer zu einer Null-Zeiger-Ausnahme. FLAG_ACTIVITY_CLEAR_TOP funktioniert nur, wenn sich die Aktivität bereits auf dem Stapel befindet.

12voto

Macarse Punkte 89366

Sie sollten den Stapel nicht ändern. Die Zurück-Taste von Android sollte wie in einem Webbrowser funktionieren.

Ich kann mir eine Möglichkeit vorstellen, aber es ist ein ziemlicher Hack.

  • Machen Sie Ihre Aktivitäten singleTask durch Hinzufügen zum AndroidManifest Exemple :

    <activity android:name=".activities.A"
              android:label="@string/A_title"
              android:launchMode="singleTask"/>
    
    <activity android:name=".activities.B"
              android:label="@string/B_title"
              android:launchMode="singleTask"/>
  • Erweitern Sie Application die die Logik des Zielortes enthält.

Exemple :

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

Von A nach B:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

Von B nach C:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

In C:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

und bedienen Sie die Zurück-Taste pop() vom Stapel.

Noch einmal: Sie sollten das nicht tun :)

9voto

Gibolt Punkte 32347

Fortgeschrittenes wiederverwendbares Kotlin:

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

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

Wenn Sie planen, diese Funktion regelmäßig zu 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
}

6voto

Versuchen Sie den folgenden Code,

Intent intent = new Intent(ManageProfileActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK| 
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

5voto

Mohammad Adil Punkte 473

Versuchen Sie dies:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

5voto

Amir Hossein Ghasemi Punkte 15079

Für mich keine der oben genannten Methoden nicht funktionieren.

Tun Sie dies einfach, um alle vorherigen Aktivitäten löschen :

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)

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