Mam 2 działania: główną i listę.
Z Main możesz otworzyć List; z listy możesz otworzyć Main.
Chciałbym, żeby każde otwarcie Listy nie zostało zapisane w „historii”. Zatem naciśnięcie wstecz z menu głównego nie może wrócić do listy.
Czy to możliwe?
Mam 2 działania: główną i listę.
Z Main możesz otworzyć List; z listy możesz otworzyć Main.
Chciałbym, żeby każde otwarcie Listy nie zostało zapisane w „historii”. Zatem naciśnięcie wstecz z menu głównego nie może wrócić do listy.
Czy to możliwe?
Odpowiedzi:
Rozpoczynając swoją listę Activity
, ustaw jej Intent
flagi w następujący sposób:
Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);
FLAG_ACTIVITY_NO_HISTORY
Flag utrzymuje nowa Activity
z dodawanych do historii stosie.
Uwaga: jak wskazuje @Sam, możesz użyć i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
zamiast tego. Nie ma różnicy funkcjonalnej.
Intent
flagi, która stwierdza, że „tylko dodaje do historii, jeśli nie powraca do Activity
początku”.
setFlags()
z getFlags()
zamiast Intent.addFlags()
?
W pliku manifestu dodaj:
android:noHistory="true"
do czynności, której nie chcesz trzymać na stosie.
Użyj nowego zadania z czyszczeniem. To zadziałało w moim przypadku, gdy inne opcje nie.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Wyczyść cały stos historii i rozpocznij nową aktywność na Androidzie
Wygląda na to, że jeśli wywołasz finish () na swojej aktywności zaraz po otwarciu innej, ta, która jest zakończona, zostanie usunięta ze stosu.
na przykład:
Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();
W moim przypadku FLAG_ACTIVITY_NO_HISTORY
nie zadziałało. Ani nie działały, FLAG_ACTIVITY_NEW_TASK
ani FLAG_ACTIVITY_CLEAR_TASK
same nie działały.
Jednak FLAG_ACTIVITY_NEW_TASK
i FLAG_ACTIVITY_CLEAR_TASK
razem wyszło.
Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Późna odpowiedź, ale dodaje nieco głębi innym odpowiedziom. Wszystko sprowadza się do tego, co chcesz, aby stało się z innymi działaniami rozpoczętymi od tego działania
Opcja 1 - Tylko to jedno działanie nie powinno mieć historii połączeń
Następnie po prostu wykonaj:
Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);
Opcja 2 - Wszystkie działania rozpoczęte od tego konkretnego działania nie powinny mieć historii
Następnie dodaj manifest aktywności wywołującej:
android:noHistory="true"
Ale jeśli chcesz mieć historię w nowej aktywności, musisz ręcznie usunąć flagę:
Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);
Mam nadzieję, że to wyjaśnia inne odpowiedzi :)
Chciałem tylko dodać sposób, aby to zrobić w Kotlinie:
val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))
Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
Wypróbuj FLAG_ACTIVITY_CLEAR_TOP, jeśli aktywność już trwa:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
dodaj flagę FLAG_ACTIVITY_NEW_TASK
do swojegoIntent
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK
Czy nie możesz zastąpić przycisku Wstecz w konkretnym działaniu, aby zatrzymać funkcję „powrotu”?
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDown(keyCode, event);
}
Activity
nie jest dobrą praktyką.
OnBackPressed
na to.
finish()
natychmiast postartActivity(...)
. W ten sposób, jeśli użytkownik naciśnie BACK z „main”, nie będzie do czego wracać.