Moja aplikacja ma następujące ekrany przepływu:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
Teraz mam wspólny log out
przycisk na każdym ekranie
( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
Chcę, aby po kliknięciu przycisku wylogowania (z dowolnego ekranu) wszystkie ekrany zostały zakończone i Log in
otworzył się nowy ekran .
Próbowałem prawie wszystkich, FLAG_ACTIVITY
aby to osiągnąć. Przeglądam także niektóre odpowiedzi w przepełnieniu stosu, ale nie jestem w stanie rozwiązać problemu. Moja aplikacja działa na Androidzie 1.6, więc nie mogę jej używaćFLAG_ACTIVITY_CLEAR_TASK
Czy jest jakiś sposób na rozwiązanie tego problemu?
Odpowiedzi:
Posługiwać się:
Spowoduje to wyczyszczenie wszystkich działań w domu.
Zakładając, że kończysz ekran logowania, gdy użytkownik loguje się i tworzona jest strona główna, a następnie wszystkie ekrany od 1 do 5 na górze tego. Kod, który opublikowałem, spowoduje powrót do ekranu głównego po zakończeniu wszystkich innych działań. Możesz dodać dodatkowy cel i przeczytać to w aktywności na ekranie głównym i zakończyć również (może ponownie uruchomić ekran logowania z tego miejsca lub coś takiego).
Nie jestem pewien, ale możesz także spróbować zalogować się przy użyciu tej flagi. W tym przypadku nie wiem, jak zostaną uporządkowane działania. Więc nie wiem, czy to wyczyści te pod ekranem, na którym jesteś, w tym ten, na którym aktualnie jesteś, ale zdecydowanie jest to dobra droga.
Mam nadzieję że to pomoże.
źródło
singleInstance
, rozważ użycieFLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP
jako flagi dla zamiaru. To zakończy działania interwencyjne i rozpocznie (lub przywróci na pierwszy plan) pożądane działanie.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
do mojej aktywności nie pomogło mi. Nie zakończyło interwencji. Po ponownym naciśnięciu ekranu logowania widzę poprzednie działania. Oto mój kodIntent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
.Możesz spróbować
Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. Całkowicie wyczyści wszystkie poprzednie działania i rozpocznie nowe działanie.źródło
Przed uruchomieniem nowego działania wystarczy dodać następujący kod:
Lub jeśli chcesz, aby działał w poprzednich wersjach Androida:
źródło
Gdy użytkownik chce wyjść ze wszystkich otwartych działań , powinien nacisnąć przycisk, który ładuje pierwsze działanie, które jest uruchamiane po uruchomieniu aplikacji, wyczyścić wszystkie pozostałe działania, a następnie zakończyć ostatnie działanie. Uruchom następujący kod, gdy użytkownik naciśnie przycisk wyjścia. W moim przypadku
LoginActivity
jest to pierwsze działanie w moim programie do uruchomienia.Powyższy kod usuwa wszystkie działania oprócz
LoginActivity
. Następnie wstaw następujący kod doLoginActivity
's'onCreate(...)
, aby nasłuchiwać, kiedyLoginActivity
zostanie odtworzony i przekazany został sygnał „EXIT”:Dlaczego tak trudny jest przycisk wyjścia w Androidzie?
System Android stara się zniechęcić użytkownika do posiadania przycisku „wyjdź” w aplikacji, ponieważ chce, aby użytkownik nigdy nie dbał o to, czy używane przez niego programy działają w tle, czy nie.
Programiści systemu operacyjnego Android chcą, aby Twój program mógł przetrwać nieoczekiwane zamknięcie i wyłączenie telefonu, a gdy użytkownik uruchomi ponownie program, rozpocznie pracę od miejsca, w którym zakończył. Dzięki temu użytkownik może odbierać połączenia telefoniczne podczas korzystania z aplikacji i otwierać mapy, które wymagają zwolnienia aplikacji w celu uzyskania większej ilości zasobów.
Gdy użytkownik wznawia twoją aplikację, odbiera ją tam, gdzie ją przerwał, bez żadnych zakłóceń. Ten przycisk wyjścia przejmuje władzę od menedżera aktywności, potencjalnie powodując problemy z automatycznie zarządzanym cyklem życia programu Android.
źródło
Działa to dla wszystkich wersji Androida. Gdzie
IntentCompat
klasa dodana w bibliotece wsparcia Android.źródło
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
nie jest rozpoznawany, użyjIntent
zamiastIntentCompat
.Użyj następujących działań
usuń flagę CLEAR_TASK w celu użycia fragmentu.
Mam nadzieję, że może to być przydatne dla niektórych osób.
źródło
Chyba się spóźniłem, ale odpowiedź jest prosta i krótka. W działaniu znajduje się metoda finishAffinity (), która zakończy bieżącą aktywność i wszystkie działania nadrzędne, ale działa tylko w systemie Android 4.1 lub nowszym.
W przypadku API 16+ użyj
finishAffinity();
Dla osób poniżej 16, użyj
ActivityCompat.finishAffinity(YourActivity.this);
Mam nadzieję, że to pomoże!
źródło
Od developer.android.com :
Zakończ to działanie, a także wszystkie działania bezpośrednio pod nim w bieżącym zadaniu, które mają to samo powinowactwo. Jest to zwykle używane, gdy aplikacja może zostać uruchomiona do innego zadania (na przykład z ACTION_VIEW typu treści, który rozumie), a użytkownik skorzystał z nawigacji w górę, aby przełączyć się z bieżącego zadania do własnego. W takim przypadku, jeśli użytkownik przejdzie w dół do innych działań drugiej aplikacji, wszystkie z nich powinny zostać usunięte z pierwotnego zadania jako część przełącznika zadań.
Pamiętaj, że to wykończenie nie pozwala na dostarczenie wyników do poprzedniej aktywności, a wyjątek zostanie zgłoszony, jeśli spróbujesz to zrobić.
źródło
Na marginesie, dobrze wiedzieć
Ta odpowiedź działa ( https://stackoverflow.com/a/13468685/7034327 )
podczas gdy to nie działa
.setFlags()
zastępuje wszystkie poprzednie flagi i nie dodaje żadnych nowych flag, gdy to.addFlags()
robi.To też zadziała
źródło
Jeśli twoja aplikacja ma minimalną wersję SDK 16, możesz użyć finishAffinity ()
Zakończ to działanie, a także wszystkie działania bezpośrednio pod nim w bieżącym zadaniu, które mają to samo powinowactwo.
Dla mnie to działa. Na ekranie Top Payment usuń wszystkie aktywacje back-stack,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
źródło
Rozwiązanie, które wdrożyłem w tym celu (myślę, że znalazłem je gdzieś na Stack Overflow, ale nie pamiętam, więc dzięki temu, kto to zrobił):
Z dowolnego ze swoich działań wykonaj to:
Następnie w swojej LoginActivity, nadpisz onKeyDown:
źródło
W przypadku przycisku wylogowania na ostatnim ekranie aplikacji użyj tego kodu w detektorze przycisku wylogowania, aby zakończyć wszystkie otwarte poprzednie działania, a problem zostanie rozwiązany.
źródło
źródło
setFlags
zastąpi wszystkie poprzednie, więc ostatniesetFlags
jest tylko ważne, poprzednie są zastąpione. Więc nie musisz dzwonići1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Mam ten sam problem, z którego możesz skorzystać
IntentCompat
, taki jak ten:ten kod działa dla mnie.
Interfejs API Androida 17
źródło
W moim przypadku używam
finishAffinity()
funkcji w ostatniej aktywności, takiej jak:Mam nadzieję, że się przyda.
źródło
zamiast używać
finish()
wystarczy użyćfinishAffinity();
źródło
Zaloguj się> Strona główna-> ekran 1-> ekran 2-> ekran 3-> ekran 4-> ekran 5
na ekranie 4 (lub dowolnym innym) ->
zźródło
dla API> = 15 do API 23 proste rozwiązanie.
źródło
Jeśli korzystasz
startActivityForResult()
z poprzednich działań, po prostu zastąpOnActivityResult()
i wywołajfinish();
metodę znajdującą się w nim we wszystkich działaniach. Spowoduje to wykonanie zadania ...źródło
startActivity
tylko.onActivityResult
każdą aktywność. Wdrożyłem sugestię DArkO i osiągnąłem swój cel i dziękuję za pomoc.Gdy użytkownik kliknie przycisk wylogowania, a następnie napisze następujący kod:
A także, gdy po zalogowaniu, jeśli wywołasz nową aktywność, nie używaj kończenia ();
źródło
Po prostu, kiedy przejdziesz z ekranu logowania, a nie po zakończeniu ekranu logowania.
Następnie we wszystkich działaniach do przodu użyj tego do wylogowania:
Działa idealnie.
źródło
Jeśli zalogujesz użytkownika,
screen 1
a następnie przejdziesz do innych ekranów, użyjźródło
onKeyDown
ionBackPressed
(lubonKeyDown
, jeśli chcesz obsługiwać wersje Androida <2.0) w każdym ze swoich działań (oprócz logowania) istartActivity(login)
tam, jak pokazano powyżej.Znalazłem w ten sposób, wyczyści całą historię i wyjdzie
źródło
Chyba się spóźniłem, ale odpowiedź jest prosta i krótka. W działaniu znajduje się metoda finishAffinity (), która zakończy bieżącą aktywność i wszystkie działania nadrzędne, ale działa tylko w systemie Android 4.1 lub nowszym.
W przypadku API 16+ użyj
finishAffinity ();
Dla osób poniżej 16, użyj
ActivityCompat.finishAffinity (YourActivity.this);
Mam nadzieję, że to pomoże!
shareedit odpowiedział 27 maja 18 o 8:03
Akshay Taru
źródło
Uważam, że to rozwiązanie działa na każdym urządzeniu pomimo poziomu interfejsu API (nawet <11)
źródło
Najlepszy sposób na zamknięcie wszystkich poprzednich działań i wyczyszczenie pamięci
źródło
źródło