Moja aplikacja pokazuje rejestrację po pierwszym uruchomieniu aplikacji, wygląda następująco:
- ActivitySplashScreen (witaj w grze, założyć konto?)
- ActivitySplashScreenSignUp (świetnie, wypełnij te informacje)
- ActivityGameMain (główny ekran gry)
więc działania uruchamiają się w dokładnie takiej kolejności, kiedy użytkownik kliknie przycisk na każdym ekranie.
Kiedy użytkownik przechodzi z czynności nr 2 do nr 3, czy można całkowicie wyczyścić stos 1 i 2 z historii? Chciałbym, aby jeśli użytkownik był na # 3 i nacisnął przycisk Wstecz, po prostu poszedł do ekranu głównego, zamiast z powrotem do ekranu powitalnego.
Myślę, że mogę to zrobić za pomocą zadań (tj. Rozpocząć nowe zadanie na nr 3), ale chciałem sprawdzić, czy istnieje prostsza metoda,
Dzięki
Odpowiedzi:
Można to osiągnąć przez ustawienie
android:noHistory
atrybutu aby"true"
w odpowiednich<activity>
wpisów wAndroidManifest.xml
pliku. Na przykład:źródło
FLAG_ACTIVITY_NO_HISTORY
.android:noHistory="true"
Możesz użyć przekazywania, aby usunąć poprzednią aktywność ze stosu aktywności podczas uruchamiania następnej. Przykład tego znajduje się w APIDemos , ale w zasadzie wszystko, co robisz, to dzwonienie
finish()
natychmiast po wywołaniustartActivity()
.źródło
FLAG_ACTIVITY_CLEAR_TOP
nie będzie działać, ponieważ C nie znajduje się już na ostatnim stosie.Tak, spójrz na Intent.FLAG_ACTIVITY_NO_HISTORY .
źródło
android:noHistory="true"
w manifeście.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
aby ustawić tę flagę.To prawdopodobnie nie jest idealny sposób na zrobienie tego. Jeśli ktoś ma lepszy sposób, nie mogę się doczekać jego wdrożenia. Oto jak ja zrealizować to zadanie szczególnego z pre-wersja-11 SDK.
w każdej klasie, którą chcesz odejść, gdy nadejdzie odpowiedni czas, musisz to zrobić:
wtedy ten, który musi uruchomić łańcuch popów ze stosu, musi po prostu wywołać to, gdy chcesz go zainicjować:
Zatem działania nie są na stosie!
Pamiętajcie, ludzie, że możecie rozpocząć działanie, a następnie rozpocząć sprzątanie za nim, wykonanie nie następuje po jednym wątku (interfejsu użytkownika).
źródło
Jednym ze sposobów, który działa wcześniej niż interfejs API 11, jest rozpoczęcie
ActivityGameMain
najpierw, a następnieonCreate
rozpoczęcieActivitySplashScreen
działania. NieActivityGameMain
pojawi się, gdy wywołasz funkcję startActivity zbyt wcześnie, aby rozpocząć powitanie.Następnie można wyczyścić stos podczas uruchamiania
ActivityGameMain
przez ustawienie tych flag na zamiar:Musisz także dodać to do ActivitySplashScreen:
Aby ponowne naciśnięcie tego działania nie powróciło do twojego
ActivityGameMain
.Zakładam, że nie chcesz wracać do ekranu powitalnego, aby to osiągnąć, sugeruję ustawienie go na
noHistory
swoimAndroidManifest.xml
. Następnie włóżgoBackPressed
kod do swojegoActivitySplashScreenSignUp
Zamiast tego klasie.Znalazłem jednak kilka sposobów na przełamanie tego. Uruchom inną aplikację z poziomu powiadomienia
ActivitySplashScreenSignUp
jest wyświetlany, a historia cofania nie jest resetowana.Jedynym realnym rozwiązaniem jest API 11:
źródło
Używam w ten sposób.
źródło
Wiem, że się spóźniłem (minęły dwa lata od momentu zadania pytania), ale udało mi się to, przechwytując naciśnięcie przycisku Wstecz. Zamiast sprawdzania konkretnych działań, po prostu patrzę na liczbę, a jeśli jest mniejsza niż 3, po prostu wysyła aplikację do tyłu (wstrzymuje aplikację i przywraca użytkownika do tego, co działało przed uruchomieniem). Sprawdzam mniej niż trzy, ponieważ mam tylko jeden ekran wprowadzający. Sprawdzam również liczbę, ponieważ moja aplikacja pozwala użytkownikowi na powrót do ekranu głównego poprzez menu, co pozwala mu tworzyć kopie zapasowe na innych ekranach w normalny sposób, jeśli na stosie znajdują się działania inne niż ekran wprowadzający.
źródło
W manifeście możesz dodać:
Możesz także zadzwonić
natychmiast po wywołaniu startActivity (..)
źródło
Wystarczy ustawić
noHistory="true"
w pliku manifestu . Sprawia, że aktywność jest usuwana z backstacka.źródło
To szalone, że nikt nie wspomniał o tym eleganckim rozwiązaniu. To powinna być zaakceptowana odpowiedź.
SplashActivity -> AuthActivity -> DashActivity
Kluczem tutaj jest skorzystanie
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
z pośrednikaActivity
. Gdy ten środkowy link zostanie zerwany,DashActivity
testament pierwszy i ostatni na stosie.android:noHistory="true"
jest złym rozwiązaniem, ponieważ powoduje problemy, gdy polega się naActivity
wywołaniu zwrotnym, nponActivityResult
. Jest to zalecane rozwiązanie i należy je zaakceptować.źródło
Jest za późno, ale mam nadzieję, że to pomoże. Większość odpowiedzi nie wskazuje właściwego kierunku. Są na to dwie proste flagi.
Z dokumentów Androida:
źródło
Po prostu wywołaj this.finish () przed startActivity (intent) w ten sposób:
źródło
Usuwanie działania z Historii odbywa się poprzez ustawienie flagi przed działaniem, którego nie chcesz
A-> B-> C-> D
Załóżmy, że A, B, C i D to 4 czynności, jeśli chcesz wyczyścić B i C, a następnie ustawić flagę
W ćwiczeniach A i B
Oto bit kodu
źródło
źródło
Spróbuj tego:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
to poziom API 1, sprawdź link .
źródło
Intent.FLAG_ACTIVITY_NO_HISTORY
?