android application - Eine Aktivität aus dem Verlaufsstapel entfernen




lifecycle fragment (12)

für API> = 15 bis API 23 andere Lösung funktioniert in meinem Fall nicht. endlich bekomme ich diesen.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Meine App zeigt eine Registrierungsaktivität an, wenn der Nutzer die App zum ersten Mal startet.

  1. ActivitySplashScreen (Willkommen im Spiel, für ein Konto anmelden?)
  2. ActivitySplashScreenSignUp (gut, füllen Sie diese Info aus)
  3. ActivityGameMain (Hauptspielbildschirm)

Die Aktivitäten starten sich also genau in dieser Reihenfolge, wenn der Benutzer auf jedem Bildschirm eine Schaltfläche anklickt.

Wenn der Benutzer von Aktivität 2 nach 3 wechselt, ist es möglich, 1 und 2 vollständig vom Verlaufsstapel zu entfernen? Ich würde es mögen, wenn der Benutzer auf # 3 ist und die Zurück-Taste drückt, gehen sie nur zum Homescreen, anstatt zurück zum Begrüßungsbildschirm.

Ich denke, ich kann das mit Aufgaben erledigen (zB eine neue Aufgabe auf # 3 starten), wollte aber sehen, ob es eine einfachere Methode gibt,

Vielen Dank


Im Manifest können Sie hinzufügen:

android:noHistory="true"

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

Sie können auch anrufen

finish()

sofort nach dem Aufruf von startActivity (..)


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 hier ist die Verwendung von intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); für die Zwischenaktivität. Sobald diese mittlere Verbindung unterbrochen ist, wird die DashActivity die erste und letzte im Stapel.

android:noHistory="true" ist eine schlechte Lösung, da es Probleme verursacht, wenn man sich auf die Activity als Callback, zB onActivityResult . Dies ist die empfohlene Lösung und sollte akzeptiert werden.


Dies ist wahrscheinlich nicht der ideale Weg, dies zu tun. Wenn jemand einen besseren Weg hat, werde ich mich darauf freuen, es umzusetzen. Hier ist, wie ich diese spezielle Aufgabe mit Pre-Version-11 SDK erreicht.

in jeder Klasse, die du weggehen willst, wenn es Zeit ist, musst du das 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 Pop-Kette aus dem Stack absetzen muss, dies nur 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, Leute, dass Sie eine Aktivität starten können, und dann beginnen, dahinter zu reinigen, die Ausführung folgt nicht einem einzigen (der ui) -Thread.


Ich benutze diesen Weg.

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

Sie können dies erreichen, indem Sie das Attribut android:noHistory in den relevanten <activity> AndroidManifest.xml in Ihrer AndroidManifest.xml Datei auf "true" AndroidManifest.xml . Beispielsweise:

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

Rufen Sie einfach this.finish () auf, bevor startActivity (intent) wie folgt-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);

Setzen Sie noHistory="true" in der Manifest- Datei. Dadurch wird Aktivität aus dem Backstack entfernt.


Versuche dies:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

es ist API Level 1, überprüfen Sie den link .


Sie können die Weiterleitung verwenden, um die vorherige Aktivität aus dem Aktivitätsstapel zu entfernen, während Sie die nächste starten. Es gibt ein Beispiel dafür in den APIDemos , aber im Prinzip rufen startActivity() nach dem Aufruf von startActivity() .


Eine Möglichkeit, die vor der API 11 funktioniert, besteht darin, zunächst ActivityGameMain zu starten und dann in der onCreate dieser Aktivität die ActivitySplashScreen Aktivität zu starten. Der ActivityGameMain wird nicht angezeigt, wenn Sie startActivity zu früh für den Splash aufrufen.

Dann können Sie den Stapel löschen, wenn Sie ActivityGameMain starten, indem Sie diese Flags auf den Intent setzen:

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

Das Zurückdrücken dieser Aktivität kehrt also nicht zu ActivityGameMain .

Ich nehme an, dass Sie nicht möchten, dass der noHistory zu einem der beiden zurückkehrt. Um dies zu erreichen, noHistory ich, ihn in Ihrer AndroidManifest.xml auf noHistory zu AndroidManifest.xml . goBackPressed Sie den goBackPressed Code stattdessen in Ihre ActivitySplashScreenSignUp Klasse ein.

Ich habe jedoch einige Wege gefunden, dies zu ändern. Starten Sie eine andere App aus einer Benachrichtigung, während ActivitySplashScreenSignUp angezeigt wird und der Hintergrundverlauf nicht zurückgesetzt wird.

Der einzige wirkliche Weg ist API 11:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Es scheint ein Übergangsritus, dass ein neuer Android-Programmierer einen Tag damit verbringt, dieses Problem zu erforschen und all diese -Threads zu lesen. Ich bin jetzt neu initiiert und ich verlasse hier die Spur meiner bescheidenen Erfahrung, um einem zukünftigen Pilger zu helfen.

Erstens gibt es keinen offensichtlichen oder sofortigen Weg dies zu tun (as of September 2012). Du würdest denken du könntest einfach startActivity(new Intent(this, LoginActivity.class), CLEAR_STACK) aber nein .

Sie können startActivity(new Intent(this, LoginActivity.class)) mit FLAG_ACTIVITY_CLEAR_TOP - und dies wird dazu führen, dass das Framework den Stack nach unten durchsuchen, Ihre frühere ursprüngliche Instanz von LoginActivity finden, neu erstellen und den Rest des (nach oben) Stapels löschen . Und da sich Login vermutlich am Ende des Stapels befindet, haben Sie jetzt einen leeren Stapel und die Zurück-Schaltfläche beendet die Anwendung.

ABER - das funktioniert nur, wenn Sie die ursprüngliche Instanz von LoginActivity an der Basis Ihres Stapels zuvor belassen haben. Wenn Sie wie viele Programmierer die LoginActivity finish() , nachdem der Benutzer sich erfolgreich angemeldet hat, befindet sie sich nicht mehr auf der Basis des Stacks und die FLAG_ACTIVITY_CLEAR_TOP Semantik FLAG_ACTIVITY_CLEAR_TOP nicht zu ... Sie LoginActivity am Ende eine neue LoginActivity oben auf dem vorhandenen Stapel. Das ist fast sicher NICHT das, was Sie wollen (seltsames Verhalten, bei dem sich der Benutzer aus dem Login in einen vorherigen Bildschirm zurückversetzen kann).

Wenn Sie also die LoginActivity bereits finish() , LoginActivity Sie einen Mechanismus zum Löschen Ihres Stacks verfolgen und dann eine neue LoginActivity . Es scheint, als wäre die Antwort von @doreamon in diesem Thread die beste Lösung (zumindest für mein bescheidenes Auge):

https://.com/a/9580057/614880

Ich vermute stark, dass die trickreichen Implikationen, ob Sie LoginActivity am Leben lassen, viel Verwirrung stiften.

Viel Glück.





android android-activity activity-lifecycle