Kiedy klikam przycisk Wyloguj w mojej aktywności profilu, chcę przenieść użytkownika na stronę logowania , gdzie musi użyć nowych poświadczeń.
Dlatego użyłem tego kodu:
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
w onButtonClick
przycisku Wyloguj.
Ale problem polega na tym, że kiedy klikam przycisk wstecz na urządzeniu w aktywności logowania, przenosi mnie do ProfileActivity. Spodziewałem się, że aplikacja powinna zostać zamknięta po naciśnięciu przycisku Wstecz urządzenia w LoginActivity.
Co ja robię źle?
Dodałem również android:launchMode="singleTop"
w manifeście dla mojego LoginActivity
Dziękuję Ci
android
back-stack
Archie.bpgc
źródło
źródło
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Odpowiedzi:
Zaproponowane tutaj rozwiązanie zadziałało u mnie:
Jawa
Kotlin
Jednak wymaga poziomu API> = 11.
źródło
FLAG_ACTIVITY_CLEAR_TASK
.To jest oficjalny sposób na zdobycie. Nie musisz zmieniać wszystkich działań w aplikacji.Oto jedno rozwiązanie, aby wyczyścić wszystkie działania aplikacji po użyciu przycisku wylogowania.
Za każdym razem, gdy zaczynasz działanie, zacznij je w ten sposób:
Jeśli chcesz zamknąć całą aplikację, zrób to:
RESULT_CLOSE_ALL to końcowa zmienna globalna z unikalną liczbą całkowitą sygnalizującą, że chcesz zamknąć wszystkie działania.
Następnie zdefiniuj
onActivityResult(...)
wywołanie zwrotne każdego działania, więc gdy działanie zwraca z wartością RESULT_CLOSE_ALL, wywołuje równieżfinish()
:Spowoduje to efekt kaskady, który zamknie wszystkie twoje działania.
Jest to jednak hack i wykorzystuje
startActivityForResult
w sposób, który nie został zaprojektowany do użytku.Być może lepszym sposobem na to byłoby użycie odbiorników telewizyjnych, jak pokazano tutaj:
Po wylogowaniu wyczyść stos historii aktywności, zapobiegając otwieraniu Aktywności tylko po zalogowaniu się za pomocą przycisku „Wstecz”
Zobacz te wątki również dla innych metod:
Android: Wyczyść tylny stos
Zakończ wszystkie poprzednie czynności
źródło
Aby całkowicie wyczyścić stos działań, chcesz utworzyć nowy stos zadań za pomocą TaskStackBuilder, na przykład:
Spowoduje to nie tylko utworzenie nowego, czystego stosu zadań, ale także pozwoli na poprawne działanie przycisku „w górę”, jeśli Twoje LoginActivity ma aktywność nadrzędną.
źródło
FLAG_ACTIVITY_NEW_TASK
lubfinishAffinity()
nie działa dla mnie. Tylko ta odpowiedź rozwiązała cel.finishAffinity()
dodane w API 16. UżywajActivityCompat.finishAffinity()
w poprzednich wersjach. Kiedy uruchomisz dowolną aktywność za pomocą intencji i zakończysz bieżącą aktywność. Teraz użyjActivityCompat.finishAffinity()
zamiast tegofinish()
. zakończy wszystkie skumulowane działania poniżej bieżącej aktywności. U mnie działa dobrze.źródło
ActivityCompat.finishAffinity()
finishAffinity()
również kończy bieżącą czynność wszystkimi działaniami obecnymi na tylnym stosie o tym samym powinowactwie.Co mi pomogło
źródło
Jedynym możliwym rozwiązaniem, które mogę zasugerować, jest dodanie
android:launchMode="singleTop"
w manifeście mojego ProfileActivity . a po kliknięciu wylogowania można się wylogować, uruchamiając ponownie LoginActivity. przy wylogowaniu możesz to nazwać.źródło
W przypadku API 11+ możesz użyć w
Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
następujący sposób:Całkowicie usunie wszystkie poprzednie działania i rozpocznie nową.
źródło
Możesz spróbować
finishAffinity()
, zamyka wszystkie bieżące działania i działa na Androidzie 4.1 i nowszychźródło
Ja też mam ten sam problem.
w aktywności logowania to, co robię, to.
przy wylogowaniu
Działa to dobrze, ale kiedy jestem w ActivityLoggedIn i minimalizuję aplikację i klikam ikonę przycisku uruchamiania na szufladzie aplikacji, MainActivity zaczyna się od nowa: - / Używam flagi
dla MainActivity.
źródło
Użyj następujących dla
activity
usuń flagę CLEAR_TASK do użycia fragmentów.
Mam nadzieję, że to może być przydatne dla niektórych osób.
źródło
Po prostu zachować
źródło
Żadna z flag intencji nie działała dla mnie, ale tak to naprawiłem:
Kiedy użytkownik wylogowuje się z jednego działania, musiałem nadać komunikat z tego działania, a następnie odebrać go w działaniach, które chciałem zamknąć, po czym wywołuję finish (); i działa całkiem nieźle.
źródło
Spróbuj tego, to zadziała:
źródło
Na poziomie API 11 lub wyższym użyj
FLAG_ACTIVITY_CLEAR_TASK
iFLAG_ACTIVITY_NEW_TASK
oflaguj na Intencie, aby wyczyścić cały stos aktywności.źródło
Użyj tego
źródło
dodaj do Manifestu dla swojej działalności
android:launchMode="singleTask"
źródło
Zaawansowany Kotlin wielokrotnego użytku:
Możesz ustawić flagę bezpośrednio za pomocą metody ustawiającej. W Kotlinie
or
jest zamiennik dla bitowego Java lub|
.Jeśli planujesz używać tego regularnie, utwórz funkcję rozszerzenia zamiaru
Następnie możesz bezpośrednio wywołać tę funkcję przed rozpoczęciem intencji
Jeśli potrzebujesz opcji dodawania dodatkowych flag w innych sytuacjach, dodaj opcjonalny parametr do funkcji rozszerzenia.
źródło