Meine App zeigt eine Anmeldeaktivität an, wenn der Benutzer die App zum ersten Mal ausführt.
- ActivitySplashScreen (Willkommen im Spiel, Konto eröffnen?)
- ActivitySplashScreenSignUp (großartig, füllen Sie diese Informationen aus)
- ActivityGameMain (Hauptspielbildschirm)
Die Aktivitäten starten sich also genau in dieser Reihenfolge, wenn der Benutzer auf jedem Bildschirm durch eine Schaltfläche klickt.
Wenn der Benutzer von Aktivität 2 zu 3 wechselt, ist es dann möglich, 1 und 2 vollständig vom Verlaufsstapel zu löschen? Ich möchte, dass der Benutzer, wenn er sich auf # 3 befindet und auf die Schaltfläche "Zurück" drückt, einfach zum Startbildschirm und nicht zum Begrüßungsbildschirm zurückkehrt.
Ich denke, ich kann dies mit Aufgaben erreichen (dh eine neue Aufgabe auf # 3 starten), wollte aber sehen, ob es eine einfachere Methode gibt.
Vielen Dank
android
android-activity
activity-lifecycle
Kennzeichen
quelle
quelle
Antworten:
Sie können dies erreichen , indem die Einstellung
android:noHistory
Attribut zu"true"
in den entsprechenden<activity>
Einträgen in derAndroidManifest.xml
Datei. Zum Beispiel:quelle
FLAG_ACTIVITY_NO_HISTORY
.android:noHistory="true"
Mit der Weiterleitung können Sie die vorherige Aktivität aus dem Aktivitätsstapel entfernen, während Sie die nächste starten. Es gibt ein Beispiel dafür in den APIDemos , aber im Grunde rufen Sie nur
finish()
sofort nach dem Anruf anstartActivity()
.quelle
FLAG_ACTIVITY_CLEAR_TOP
funktioniert nicht, da C nicht bereits im Backstack enthalten ist.Ja, schauen Sie sich Intent.FLAG_ACTIVITY_NO_HISTORY an .
quelle
android:noHistory="true"
im Manifest festgelegt.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
, um dieses Flag zu setzen.Dies ist wahrscheinlich nicht der ideale Weg, dies zu tun. Wenn jemand einen besseren Weg hat, freue ich mich darauf, ihn umzusetzen. Hier ist, wie ich diese spezielle Aufgabe mit SDK vor Version 11 erledigt habe.
In jeder Klasse, die Sie verlassen möchten, wenn es klar ist, müssen Sie Folgendes tun:
dann muss derjenige, der die Pop-Kette vom Stapel abheben muss, dies einfach aufrufen, wenn Sie es initiieren möchten:
Dann sind die Aktivitäten nicht auf dem Stapel!
Denken Sie daran, Leute, dass Sie eine Aktivität starten und dann dahinter aufräumen können. Die Ausführung folgt keinem einzelnen (der UI) Thread.
quelle
Eine Möglichkeit, die vor API 11 funktioniert, besteht darin,
ActivityGameMain
zuerst zu starten und dann inonCreate
dieser Aktivität IhreActivitySplashScreen
Aktivität zu starten . DasActivityGameMain
wird nicht angezeigt, wenn Sie startActivity zu früh für den Splash aufrufen.Dann Sie können den Stapel löschen beim Start
ActivityGameMain
durch das Setzen diesen Flags auf dem Intent:Sie müssen dies auch zu ActivitySplashScreen hinzufügen:
Das Zurückdrücken dieser Aktivität geht also nicht auf Ihre zurück
ActivityGameMain
.Ich gehe davon aus, dass Sie nicht möchten, dass der Begrüßungsbildschirm wieder angezeigt wird. Um dies zu erreichen, schlage ich vor, ihn
noHistory
in Ihrem Bildschirm einzustellenAndroidManifest.xml
. FügengoBackPressed
Sie dannActivitySplashScreenSignUp
stattdessen den Code in Ihre Klasse ein.Ich habe jedoch einige Möglichkeiten gefunden, dies zu brechen. Starten Sie eine andere App von einer Benachrichtigung aus, während diese
ActivitySplashScreenSignUp
angezeigt wird und der Hintergrund nicht zurückgesetzt wird.Der einzige wirkliche Weg, dies zu umgehen, ist in API 11:
quelle
Ich benutze diesen Weg.
quelle
Ich weiß, dass ich zu spät dran bin (es ist zwei Jahre her, seit die Frage gestellt wurde), aber ich habe dies erreicht, indem ich den Druck auf die Zurück-Taste abgefangen habe. Anstatt nach bestimmten Aktivitäten zu suchen, schaue ich mir nur die Anzahl an und wenn es weniger als 3 ist, schickt es die App einfach nach hinten (pausiert die App und bringt den Benutzer zu dem zurück, was vor dem Start ausgeführt wurde). Ich suche nach weniger als drei, weil ich nur einen Intro-Bildschirm habe. Außerdem überprüfe ich die Anzahl, da der Benutzer mit meiner App über das Menü zum Startbildschirm zurückkehren kann, sodass er wie gewohnt über andere Bildschirme sichern kann, wenn andere Aktivitäten als der Intro-Bildschirm auf dem Stapel vorhanden sind.
quelle
Im Manifest können Sie hinzufügen:
Sie können auch anrufen
unmittelbar nach dem Aufruf von startActivity (..)
quelle
Einfach
noHistory="true"
in Manifest- Datei einstellen . Dadurch wird die Aktivität aus dem Backstack entfernt.quelle
Es ist verrückt, dass niemand diese elegante Lösung erwähnt hat. Dies sollte die akzeptierte Antwort sein.
SplashActivity -> AuthActivity -> DashActivity
Der Schlüssel hier ist
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
für den Vermittler zu verwendenActivity
. Sobald diese mittlere Verbindung unterbrochen ist,DashActivity
wird der erste und letzte im Stapel.android:noHistory="true"
ist eine schlechte Lösung, da es Probleme verursacht, wenn man sich auf dasActivity
als Rückruf verlässt, zonActivityResult
. Dies ist die empfohlene Lösung und sollte akzeptiert werden.quelle
Es ist zu spät, aber ich hoffe, es hilft. Die meisten Antworten zeigen nicht in die richtige Richtung. Es gibt zwei einfache Flaggen für so etwas.
Aus Android-Dokumenten:
quelle
Rufen Sie einfach this.finish () auf, bevor Sie startActivity (intent) wie folgt starten:
quelle
Das Entfernen einer Aktivität aus einem Verlauf erfolgt durch Setzen des Flags vor der Aktivität, die Sie nicht möchten
A-> B-> C-> D.
Angenommen, A, B, C und D sind 4 Aktivitäten, wenn Sie B und C löschen möchten, und setzen Sie dann das Flag
In der Aktivität A und B.
Hier ist das Codebit
quelle
quelle
Versuche dies:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
Es ist API Level 1, überprüfen Sie den Link .
quelle
Intent.FLAG_ACTIVITY_NO_HISTORY
?