Czy można rozpocząć działanie na stosie, czyszcząc całą historię przed nim?
Sytuacja
Mam stos aktywności, który albo A-> B-> C lub B-> C (ekran A wybiera token użytkowników, ale wielu użytkowników ma tylko jeden token).
Na ekranie C użytkownik może podjąć działanie, które powoduje, że ekran B jest nieważny, więc aplikacja chce przenieść go na ekran A, niezależnie od tego, czy znajduje się już na stosie. Ekran A powinien być zatem jedynym elementem na stosie w mojej aplikacji.
Notatki
Jest wiele innych podobnych pytań, ale nie znalazłem niczego, co odpowiadałoby dokładnie na to pytanie. Próbowałem zadzwonić getParent().finish()
- zawsze powoduje to wyjątek wskaźnika zerowego. FLAG_ACTIVITY_CLEAR_TOP
działa tylko wtedy, gdy aktywność jest już na stosie.
źródło
Przypadek 1: Tylko dwie czynności A i B:
Tutaj przepływ działań to A-> B.Kliknięcie przycisku B z B musimy zamknąć aplikację, a następnie uruchamiając działanie B z A po prostu wywołaj polecenie zakończenia (), co uniemożliwi Androidowi zapisywanie działania A w Backstack.eg dla działania A jest Loding / Splash ekran aplikacji.
Przypadek 2: Więcej niż dwa działania:
Jeśli istnieje przepływ taki jak A-> B-> C-> D-> B i po kliknięciu przycisku Wstecz w działaniu B, gdy pochodzi on z działania D. W takim przypadku powinniśmy użyć.
Tutaj działanie B zostanie uruchomione z backstacka, a nie z nowej instancji z powodu Intent.FLAG_ACTIVITY_CLEAR_TOP i Intent.FLAG_ACTIVITY_NEW_TASK usuwa stos i czyni go najwyższym, więc po naciśnięciu przycisku Wstecz cała aplikacja zostanie zakończona.
źródło
Z nowszą wersją Androida> = użyj interfejsu API 16
finishAffinity()
podejście jest odpowiednie dla> = API 16.
źródło
Spędziłem nad tym także kilka godzin ... i zgadzam się, że FLAG_ACTIVITY_CLEAR_TOP brzmi tak, jak chcesz: wyczyść cały stos, z wyjątkiem uruchomionej aktywności, więc przycisk Wstecz wychodzi z aplikacji. Jednak, jak wspomniał Mike Repass, FLAG_ACTIVITY_CLEAR_TOP działa tylko wtedy, gdy aktywność, którą uruchamiasz, znajduje się już na stosie; gdy działania nie ma, flaga nic nie robi.
Co robić? Umieść uruchamiane działanie w stosie za pomocą FLAG_ACTIVITY_NEW_TASK, co powoduje, że działanie to rozpoczyna nowe zadanie na stosie historii. Następnie dodaj flagę FLAG_ACTIVITY_CLEAR_TOP.
Teraz, gdy FLAG_ACTIVITY_CLEAR_TOP pójdzie znaleźć nową aktywność na stosie, będzie tam i zostanie podniesiona, zanim wszystko inne zostanie wyczyszczone.
Oto moja funkcja wylogowania; parametr View to przycisk, do którego dołączona jest funkcja.
źródło
Nie powinieneś zmieniać stosu. Przycisk Wstecz Androida powinien działać jak w przeglądarce internetowej.
Mogę wymyślić sposób, aby to zrobić, ale to dość hack.
Wykonaj swoje działania
singleTask
, dodając je doAndroidManifest
przykładu:Rozszerz,
Application
która będzie zawierać logikę, gdzie iść.Przykład:
Od A do B:
Od B do C:
W C:
i przytrzymaj przycisk powrotu do
pop()
stosu.Jeszcze raz nie powinieneś tego robić :)
źródło
Application
wystąpienia ich system operacyjny nie będzie w stanie zwolnić pamięci RAM pozostałej po zniszczonych działaniach.Natychmiast po rozpoczęciu nowej aktywności za pomocą
startActivity
upewnij się, że dzwonisz,finish()
aby bieżąca aktywność nie została ułożona za nową.źródło
Spróbuj tego:
źródło
Zaawansowane wielokrotnego użytku Kotlin:
Możesz ustawić flagę bezpośrednio za pomocą metody setter. W Kotlin
or
jest zamiennikiem Java bitowej lub|
.Jeśli planujesz używać tego regularnie, utwórz funkcję rozszerzenia Intent
Następnie możesz bezpośrednio wywołać tę funkcję przed rozpoczęciem zamiaru
Jeśli potrzebujesz opcji dodania dodatkowych flag w innych sytuacjach, dodaj opcjonalny parametr do funkcji rozszerzenia.
źródło
źródło
Wypróbuj poniższy kod,
źródło
Dla mnie żadna z powyższych metod nie działa.
Po prostu zrób to, aby wyczyścić wszystkie poprzednie działania :
źródło
Czasami emulator Androida może nie połączyć się z narzędziem DDMS zaćmienia i poprosić o ręczne uruchomienie adb. W takim przypadku możesz uruchomić lub zatrzymać adb za pomocą wiersza polecenia.
źródło
Znalazłem zbyt prosty hack, po prostu dodaj ten nowy element
AndroidManifest
jako:android:noHistory
skasuje niechcianych aktywności ze stosu.źródło