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 lautet (Bildschirm A wählt das Benutzertoken aus, aber viele Benutzer haben nur ein einziges Token).
Im Bildschirm C der Benutzer kann eine Aktion , den Bildschirm B ungültig macht, so dass die Anwendung sie auf Bildschirm A nehmen will, und zwar unabhängig davon , ob es bereits in dem Stapel. Bildschirm A sollte dann das einzige Element auf dem Stapel in meiner Anwendung sein.
Anmerkungen
Es gibt viele andere ähnliche Fragen, aber ich habe nichts gefunden, was genau diese Frage beantwortet. Ich habe versucht anzurufen getParent().finish()
- dies führt immer zu einer Nullzeigerausnahme. FLAG_ACTIVITY_CLEAR_TOP
Funktioniert nur, wenn sich die Aktivität bereits auf dem Stapel befindet.
quelle
Fall 1: Nur zwei Aktivitäten A und B:
Hier ist der Aktivitätsfluss A-> B. Wenn Sie auf die Schaltfläche "Zurück" von B klicken, müssen Sie die Anwendung schließen. Wenn Sie dann die Aktivität B von A aus starten, rufen Sie einfach finish () auf. Dadurch wird verhindert, dass Android die Aktivität A im Backstack.eg für Aktivität A speichert Loding / Splash-Bildschirm der Anwendung.
Fall 2: Mehr als zwei Aktivitäten:
Wenn es einen Fluss wie A-> B-> C-> D-> B gibt und Sie in Aktivität B auf die Schaltfläche Zurück klicken, während Sie von Aktivität D kommen. In diesem Fall sollten wir verwenden.
Hier wird Aktivität B aufgrund von Intent.FLAG_ACTIVITY_CLEAR_TOP und Intent.FLAG_ACTIVITY_NEW_TASK vom Backstack aus gestartet und nicht von einer neuen Instanz. Dadurch wird der Stapel gelöscht und zum obersten. Wenn wir also die Zurück-Taste drücken, wird die gesamte Anwendung beendet.
quelle
Mit der neueren Version von Android> = API 16 verwenden
finishAffinity()
Ansatz ist geeignet für> = API 16.
quelle
Ich habe auch ein paar Stunden damit verbracht ... und bin damit einverstanden, dass FLAG_ACTIVITY_CLEAR_TOP so klingt, wie Sie es möchten: Löschen Sie den gesamten Stapel, mit Ausnahme der Aktivität, die gestartet wird, sodass die Schaltfläche Zurück die Anwendung beendet. Wie Mike Repass bereits erwähnt hat, funktioniert FLAG_ACTIVITY_CLEAR_TOP nur, wenn sich die Aktivität, die Sie starten, bereits im Stapel befindet. Wenn die Aktivität nicht vorhanden ist, führt die Flagge nichts aus.
Was ist zu tun? Fügen Sie die zu startende Aktivität mit FLAG_ACTIVITY_NEW_TASK in den Stapel ein. Dadurch wird diese Aktivität zum Start einer neuen Aufgabe im Verlaufsstapel. Fügen Sie dann das Flag FLAG_ACTIVITY_CLEAR_TOP hinzu.
Wenn FLAG_ACTIVITY_CLEAR_TOP die neue Aktivität im Stapel findet, wird sie dort angezeigt und aufgerufen, bevor alles andere gelöscht wird.
Hier ist meine Abmeldefunktion. Der Parameter Ansicht ist die Schaltfläche, an die die Funktion angehängt ist.
quelle
Sie sollten den Stapel nicht ändern. Die Android-Zurück-Schaltfläche sollte wie in einem Webbrowser funktionieren.
Ich kann mir einen Weg vorstellen, es zu tun, aber es ist ein ziemlicher Hack.
Machen Sie Ihre Aktivitäten,
singleTask
indem Sie sie demAndroidManifest
Beispiel hinzufügen :Erweitern Sie
Application
, um die Logik des Ziels festzulegen .Beispiel:
Von A nach B:
Von B nach C:
In C:
und betätigen Sie den Zurück-Knopf
pop()
vom Stapel.Noch einmal, du solltest das nicht tun :)
quelle
Application
ihre Instanzen benötigt, kann das Betriebssystem den verbleibenden RAM nicht mehr von den zerstörten Aktivitäten freigeben.Stellen Sie unmittelbar nach dem Starten einer neuen Aktivität mit
startActivity
sicher, dass Sie aufrufen,finish()
damit die aktuelle Aktivität nicht hinter der neuen gestapelt wird.quelle
Versuche dies:
quelle
Erweitertes wiederverwendbares Kotlin:
Sie können das Flag direkt mit der Setter-Methode setzen. In Kotlin
or
ist der Ersatz für Java bitweise oder|
.Wenn Sie dies regelmäßig verwenden möchten, erstellen Sie eine Absichtserweiterungsfunktion
Sie können diese Funktion dann direkt aufrufen, bevor Sie die Absicht starten
Wenn Sie in anderen Situationen die Option zum Hinzufügen zusätzlicher Flags benötigen, fügen Sie der Erweiterungsfunktion einen optionalen Parameter hinzu.
quelle
quelle
Versuchen Sie unten Code,
quelle
Bei mir funktioniert keine der oben genannten Methoden .
Tun Sie dies einfach, um alle vorherigen Aktivitäten zu löschen :
quelle
Manchmal kann es sein, dass Ihr Android-Emulator keine Verbindung zum Eclipse-DDMS-Tool herstellt und adb auffordert, manuell zu starten. In diesem Fall können Sie die ADB über die Eingabeaufforderung starten oder stoppen.
quelle
Ich fand zu einfachen Hack einfach dies hinzufügen neues Element hinzufügen
AndroidManifest
als: -die
android:noHistory
Ihre unerwünschte Aktivität von Stapel löschen.quelle