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

Czy jest jakiś sposób na rozwiązanie problemu ?
Author: Adnan Abdollah Zaki, 2011-06-13

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.
 469
Author: DArkO,
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ść.

 268
Author: Kong Ken,
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);
 108
Author: Henrique,
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.

 36
Author: Eric Leschinski,
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.

 29
Author: Gem,
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.

 25
Author: Aristo Michael,
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

Z developer.android.com :

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ć.

 17
Author: gmrl,
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

 12
Author: Jaydeep purohit,
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);
}
 10
Author: Andy,
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);
}
 10
Author: Amrit,
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();
 8
Author: Prashant Kumar,
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

 8
Author: Adnan Abdollah Zaki,
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);
 8
Author: John,
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
 6
Author: Plamen Nikolov,
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);

Mam nadzieję, że to pomoże!
 6
Author: Akshay Taru,
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...

 5
Author: ngesh,
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);
 5
Author: lotus weaver,
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();

 5
Author: Hitesh Kushwah,
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 ();

 3
Author: nikki,
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);
 3
Author: Krishna Mohan Singh,
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);
 1
Author: Gabriel Negut,
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.
 1
Author: Asad Rao,
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);
 1
Author: piero.ir,
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);
 0
Author: priyankvex,
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