it-swarm.com.de

Alle Aktivitäten einer Aufgabe löschen?

Ich habe eine Startbildschirm-Aktivität, dann eine Login-Aktivität. Mein History-Stack sieht folgendermaßen aus:

SplashActivity
LoginActivity

wenn sich der Benutzer erfolgreich über LoginActivity anmeldet, möchte ich WelcomeActivity starten, den gesamten Stack jedoch löschen:

SplashActivity
LoginActivity // launches WelcomeActivity ->
WelcomeActivity

// but now all three are in the history stack, while I only
// want WelcomeActivity in the stack at this point.

Gibt es eine Flagge, die ich dafür verwenden kann?

// LoginActivity.Java
Intent intent = new Intent(this, WelcomeActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();

Nicht sicher, ob mit FLAG_ACTIVITY_CLEAR_TASK alle Aktivitäten in meiner Aufgabe gelöscht werden oder nicht. Ich kann dies "manuell" tun, indem ich den Stapel mithilfe von startActivityForResult () - Aufrufen abwickle. Ich werde jedoch anfälliger und muss mehr Code verwalten.

Vielen Dank

41
user291701

Ja, das sollte gut funktionieren. Du könntest benutzen:

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

dadurch wird sichergestellt, dass, wenn eine Instanz bereits ausgeführt wird und nicht oben ist, alle darauf befindlichen Objekte gelöscht und verwendet werden, anstatt eine neue Instanz zu starten (dies ist nützlich, sobald Sie sich für die Willkommensaktivität -> Aktivität A und dann entschieden haben Sie möchten von A nach Welcome zurückkehren, aber die zusätzlichen Flags sollten Ihren Fall nicht beeinträchtigen.

40
Joseph Earl

Verwenden Sie Android:noHistory="true" für die Splash-Aktivität in der Manifestdatei. 

<activity 
Android:name=".activity.SplashActivity" 
Android:theme="@style/theme_noActionBar" 
Android:noHistory="true">
9
Daniel De León

finish() entfernt die Aktivität vom Stapel. Wenn Sie also LoginActivity starten und finish() bei SplashActivity aufrufen und dann genau das gleiche tun, um WelcomeActivity zu starten, erhalten Sie das gewünschte Verhalten. Es müssen keine zusätzlichen Flags verwendet werden.

8
Pancho C.

Intent.FLAG_ACTIVITY_NO_HISTORY kann auch in Ihrem Fall funktionieren, wenn Sie die Aktivität nicht auf dem Protokollstapel haben möchten.

7
Yuntao
Intent intent = new Intent(this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
6
user4972508
  • Wenn alle drei Aktivitäten in derselben App (derselben taskAffinity) enthalten sind, können Sie unten entweder 1,2 oder 3 auswählen. Ansonsten sollten Sie 1,2 auswählen.

    1. Wenn Sie SplashActivity aus LoginActivity nicht zurückgeben möchten, können Sie das Aktivitätsattribut noHistory in AndroidManifest.xml definieren oder FLAG_ACTIVITY_NO_HISTORY festlegen, um SplashActivity zu starten. Wenn SplashActivity von Launcher aus gestartet wird, sollten Sie einen Weg wählen, um das Aktivitätsattribut noHistory festzulegen.

    2. Wenn Sie LoginActivity nicht von WelcomeActivity zurückgeben möchten, können Sie entweder das Aktivitätsattribut noHistory oder FLAG_ACTIVITY_NO_HISTORY wie Nummer 1 verwenden.

    3. Wenn Sie den Stack in bestimmten Situationen zurücksetzen möchten, können Sie FLAG_ACTIVITY_CLEAR_TASK in Verbindung mit FLAG_ACTIVITY_NEW_TASK verwenden (FLAG_ACTIVITY_CLEAR_TASK muss immer in Verbindung mit FLAG_ACTIVITY_NEW_TASK verwendet werden). Wenn die gestartete Aktivität jedoch an einer anderen App beteiligt ist (d. H. Einer anderen TaskAffinity), wird die Task nach dem Löschen der Task mit einer anderen Task gestartet, nicht mit der aktuellen Task. Stellen Sie daher sicher, dass die gestartete Aktivität in derselben App (taskAffinity) enthalten ist.

0
Joo Young Jung

Tun Sie dies einfach, um alle vorherigen Aktivitäten in einer Aufgabe zu 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)