W mojej aplikacji mam kilka działań. a przepływ jest bardzo skomplikowany. Po kliknięciu aplikacji Logout następuje przejście do ekranu logowania i stamtąd użytkownik może wyjść za pomocą przycisku anulowania (dzwonienie system.exit(0)
)
kiedy wychodzę lub cofam, system wywołuje działanie ze stosu :( jak mogę wyczyścić wszystkie działania na stosie po przejściu do ekranu logowania? wywołanie finish()
jest niepraktyczne, ponieważ jest tak wiele działań, a niektóre działania nie powinny być zamykane, gdy są one aktywne, na przykład wywołujące aktywność aparatu natywnego.
validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);
android
android-activity
stack
Jay Mayu
źródło
źródło
Odpowiedzi:
Większość z was się myli. Jeśli chcesz zamknąć istniejący stos aktywności niezależnie od tego, co tam jest i utworzyć nowy root, prawidłowy zestaw flag jest następujący:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Z dokumentu :
źródło
IntentCompat.makeRestartActivityTask
biblioteka wsparcia.Kiedy dzwonisz
startActivity
na ostatnią czynność, z której zawsze możesz skorzystaćjako flaga w tym zamiarze.
Przeczytaj więcej o fladze tutaj .
źródło
Oto prosta metoda pomocnicza do rozpoczynania nowej aktywności jako nowej najwyższej aktywności, która działa od poziomu API 4 do obecnej wersji 17:
static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) { Intent intent = new Intent(currentActivity, newTopActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11 currentActivity.startActivity(intent); }
nazwij to w ten sposób od swojej bieżącej aktywności:
startNewMainActivity(this, MainActivity.class);
źródło
Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
jeszczeintent.addFlags(0x8000);
nigdy nie dodajeWyczyść stan konta za pomocą poniższego kodu:
Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
Gotowe
źródło
W moim przypadku LoginActivity również został zamknięty. W rezultacie,
nie pomogło.
Jednak ustawienie
Intent.FLAG_ACTIVITY_NEW_TASK
pomogło mi.
źródło
Intent intent = new Intent(LoginActivity.this, Home.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity startActivity(intent); this.finish();
źródło
this.finish()
isetFlags()
także do wyczyszczenia bieżącej aktywności?Zauważyłem, że prosiłeś o rozwiązanie, na którym nie można polegać
finish()
, ale zastanawiam się, czy to mimo wszystko pomoże.Śledziłem, czy flaga wyjścia jest podnoszona za pomocą statycznej zmiennej klasy, która przetrwa cały okres życia aplikacji. W każdym odpowiednim działaniu
onResume()
użyj@Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } }
Klasa ExitHelper
public class ExitHelper { public static boolean isExitFlagRaised = false; }
Powiedzmy, że w mainActivity użytkownik naciska przycisk, aby wyjść - możesz ustawić
ExitHelper.isExitFlagRaised = true;
a następniefinish()
. Następnie inne istotne działania, które zostaną automatycznie wznowione, również zostaną zakończone.źródło
Ta decyzja działa dobrze:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Ale nowa aktywność zaczyna się długo i jakiś czas pojawia się biały ekran. Jeśli jest to krytyczne, zastosuj to obejście:
public class BaseActivity extends AppCompatActivity { private static final String ACTION_FINISH = "action_finish"; private BroadcastReceiver finisBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { finish(); } }, new IntentFilter(ACTION_FINISH)); } public void clearBackStack() { sendBroadcast(new Intent(ACTION_FINISH)); } @Override protected void onDestroy() { unregisterReceiver(finisBroadcastReceiver); super.onDestroy(); } }
Jak to wykorzystać:
public class ActivityA extends BaseActivity { // Click any button public void startActivityB() { startActivity(new Intent(this, ActivityB.class)); clearBackStack(); } }
Wada: wszystkie działania, które muszą zostać zamknięte na stosie, muszą być rozszerzeniem BaseActivity
źródło
W przypadku deweloperów platformy Xamarin możesz użyć:
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
źródło
Korzystanie z Kotlin:
Możesz ustawić flagę bezpośrednio za pomocą metody ustawiającej. W Kotlinie
or
jest zamiennik dla bitowego Java lub|
.intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
Jeśli planujesz używać tego regularnie, utwórz funkcję rozszerzenia zamiaru
fun Intent.clearStack() { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK }
Następnie możesz bezpośrednio wywołać tę funkcję przed rozpoczęciem intencji
intent.clearStack()
źródło
Zamiar zamiaru = nowy zamiar (LoginActivity.this, MainActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity (intencja); koniec();
źródło