Zakończ wszystkie poprzednie działania
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 gdy użytkownik kliknie przycisk Wyloguj (z dowolnego ekranu), wszystkie ekrany zostaną zakończone i otworzy się nowy ekran Log in
.
Próbowałem prawie wszystkich FLAG_ACTIVITY
, Aby to osiągnąć.
Przechodzę również przez kilka odpowiedzi w stackoverflow, ale nie jestem w stanie rozwiązać problemu.
Moja aplikacja jest na Androidzie 1.6 więc nie jest możliwość użycia FLAG_ACTIVITY_CLEAR_TASK
24 answers
Użycie:
Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
To wyczyści wszystkie czynności na górze domu.
Zakładając, że kończysz ekran logowania, gdy użytkownik loguje się i tworzony jest home, a następnie wszystkie ekrany od 1 do 5 na górze tego. Kod, który wysłałem, przywróci cię do ekranu głównego, kończąc wszystkie inne działania. Możesz dodać dodatkowe w intencji i przeczytać, że w aktywności na ekranie głównym i zakończyć go również (może uruchomić ekran logowania ponownie stamtąd lub coś).
Jestem nie jestem pewien, ale możesz również spróbować zalogować się za pomocą tej flagi. Nie wiem, jak w takim przypadku zostaną uporządkowane działania. Więc nie wiem, czy wyczyści te poniżej ekranu, na którym się znajdujesz, w tym ten, na którym się aktualnie znajdujesz, ale zdecydowanie jest to droga.
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 20:37:53
Możesz spróbować Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. Całkowicie usunie wszystkie poprzednie aktywności i rozpocznie nową aktywność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-20 08:08:50
Przed uruchomieniem nowej aktywności, po prostu dodaj następujący kod:
finishAffinity();
Lub jeśli chcesz, aby działał w poprzednich wersjach Androida:
ActivityCompat.finishAffinity(this);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-29 13:11:05
Gdy użytkownik chce zakończyć wszystkie otwarte działania, powinien nacisnąć przycisk, który ładuje pierwszą aktywność, która jest uruchamiana po uruchomieniu aplikacji, wyczyścić wszystkie inne działania, a następnie zakończyć ostatnią pozostałą aktywność. Po naciśnięciu przycisku exit uruchom następujący kod. W moim przypadku {[2] } jest pierwszą aktywnością w moim programie do uruchomienia.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
Powyższy kod usuwa wszystkie czynności z wyjątkiem LoginActivity
. Następnie umieść następujący kod wewnątrz LoginActivity
' s onCreate(...)
, aby nasłuchać, kiedy LoginActivity
zostanie odtworzone i przekazany zostanie sygnał "EXIT":
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
Dlaczego tworzenie przycisku wyjścia w Androidzie jest takie trudne?
[7]}Android stara się zniechęcić cię do posiadania przycisku "exit" w aplikacji, ponieważ chce, aby użytkownik nigdy nie przejmował się tym, czy programy, których używa, działają w tle, czy nie. [7]}twórcy systemu operacyjnego Android chcą, aby twój program przetrwał nieoczekiwane wyłączenie i wyłączenie zasilania telefon, a kiedy użytkownik uruchamia ponownie program, zaczyna tam, gdzie skończył. Dzięki temu użytkownik może odbierać telefon podczas korzystania z aplikacji i otwierać mapy, co wymaga uwolnienia aplikacji, aby uzyskać więcej zasobów.Kiedy użytkownik wznawia swoją aplikację, zaczyna tam, gdzie zakończył bez przerwy. Ten Przycisk Wyjścia uzurpuje moc z menedżera aktywności, potencjalnie powodując problemy z automatycznie zarządzanym życiem programu android cykl.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 06:07:51
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
To będzie działać dla wszystkich wersji Androida. Gdzie IntentCompat
klasa dodana w Bibliotece obsługi Androida.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 08:16:56
Użyj następującego działania
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Usuń znacznik CLEAR_TASK dla użycia fragmentu.
Mam nadzieję, że to może się przydać dla niektórych ludzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 10:54:17
public void finishAffinity ()
Dodany w API poziom 16
Zakończ to działanie, jak również wszystkie działania bezpośrednio pod nim w bieżącym zadaniu, które mają takie samo powinowactwo. Jest to zwykle używane, gdy aplikacja może być uruchomiona do innego zadania (np. z ACTION_VIEW typu treści, które rozumie), a użytkownik użył nawigacji w górę, aby przełączyć się z bieżącego zadania i do własnego zadania. W takim przypadku, jeśli użytkownik ma po przejściu do innych czynności drugiej aplikacji, wszystkie te powinny zostać usunięte z pierwotnego zadania jako część przełącznika zadań.
Zauważ, że to wykończenie nie pozwala na dostarczenie wyników do poprzedniej aktywności, a wyjątek zostanie wyrzucony, jeśli próbujesz to zrobić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 12:25:04
Jeśli Twoja aplikacja ma minimum sdk w wersji 16, możesz użyć finishAffinity()
Zakończ to działanie, jak również wszystkie działania bezpośrednio pod nim w bieżącym zadaniu, które mają takie samo powinowactwo.
To jest praca dla mnie w górnym ekranie płatności usuń wszystkie działania back-stack,
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
Http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-03 09:50:17
Rozwiązanie, które zaimplementowałem do tego (chyba znalazłem je gdzieś na Stack Overflow, ale nie pamiętam, więc dzięki temu, kto to zrobił w pierwszej kolejności):
Z któregokolwiek z twoich działań zrób to:
// Clear your session, remove preferences, etc.
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Następnie w loginie Nadpisz onKeyDown:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 06:13:56
Dla przycisku Wyloguj się na ostatnim ekranie aplikacji, Użyj tego kodu na słuchaczu przycisku Wyloguj, aby zakończyć wszystkie otwarte poprzednie działania, a twój problem zostanie rozwiązany.
{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 10:44:47
Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 06:15:08
Mam ten sam problem
możesz użyć IntentCompat
, TAK:
import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Ten kod działa dla mnie .
Android api 17
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 19:09:25
Na marginesie, dobrze wiedzieć
Ta odpowiedź działa ( https://stackoverflow.com/a/13468685/7034327 )
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
While this doesn ' t work
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
.setFlags()
zastępuje wszystkie poprzednie flagi i nie dodaje żadnych nowych flag podczas gdy .addFlags()
robi.
Więc to również zadziała
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:33
Zaloguj się - > Strona główna->Ekran 1->Ekran 2->Ekran 3->Ekran 4 - > Ekran 5
Na ekranie 4 (lub innym) - >
StartActivity(Log in)z
FLAG_ACTIVITY_CLEAR_TOP
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 13:33:49
Chyba się spóźniłem, ale jest prosta i krótka odpowiedź. W aktywności 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.
Dla API 16+ użyj
finishAffinity();
Dla poniżej 16, użyj
ActivityCompat.finishAffinity(YourActivity.this);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-27 08:03:08
Jeśli używasz startActivityForResult()
w swoich poprzednich czynnościach, po prostu Nadpisz OnActivityResult()
i wywołaj wewnątrz niej metodę finish();
we wszystkich czynnościach.. To wystarczy...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 06:02:44
Dla API > = 15 do API 23 proste rozwiązanie.
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 17:52:23
Zamiast używać finish()
wystarczy użyć finishAffinity();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 06:00:45
Gdy użytkownik kliknie na przycisk Wyloguj, wpisz następujący kod:
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
A także gdy po zalogowaniu, jeśli wywołasz nową aktywność, nie używaj finish ();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-07 12:43:01
W API na poziomie 11 lub wyższym, użyj znacznika FLAG_ACTIVITY_CLEAR_TASK i FLAG_ACTIVITY_NEW_TASK w celu wyczyszczenia całego stosu aktywności.
Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 03:38:06
Jeśli zalogujesz się do użytkownika w screen 1
i stamtąd przechodzisz do innych ekranów, użyj
Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 12:23:36
Po prostu, gdy przechodzisz z ekranu logowania, a nie gdy kończysz ekran logowania.
A następnie we wszystkich działaniach forward użyj tego do wylogowania:
final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
Działa idealnie.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 06:14:54
Znalazłem ten sposób, wyczyści całą historię i wyjdzie
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
System.exit(0);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 19:16:40
Znalazłem to rozwiązanie do pracy na każdym urządzeniu pomimo poziomu API (nawet dla
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-05 08:22:56