Android: otwarta aktywność bez zapisywania w stosie


94

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?


11
Jeśli „lista” zaczyna się od „main”, należy ją wywołać finish()natychmiast po startActivity(...). W ten sposób, jeśli użytkownik naciśnie BACK z „main”, nie będzie do czego wracać.
Squonk,

to służy do nawigacji po powiadomieniach, ale koncepcje mogą mieć zastosowanie developer.android.com/guide/topics/ui/notifiers/ ...
Kevin Lee

Odpowiedzi:


160

Rozpoczynając swoją listę Activity, ustaw jej Intentflagi 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_HISTORYFlag utrzymuje nowa Activityz 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.


2
Tylko mały komentarz na temat tej metody: ta będzie działać idealnie, jeśli są tylko 2 Aktywności. Ale jeśli lista Działanie może uruchomić inne działanie (powiedzmy trzecie działanie), naciśnięcie przycisku Wstecz w trzecim działaniu spowoduje powrót do głównego działania, a nie listy Działanie
VinceFR

W rzeczy samej. Niestety nie sposób tego uniknąć. Nie ma Intentflagi, która stwierdza, że ​​„tylko dodaje do historii, jeśli nie powraca do Activitypoczątku”.
Eric

1
nie, ale flaga FLAG_ACTIVITY_NEW_TASK wykona zadanie, lista Czynność zostanie dodana do historii, ale zawsze na górze, więc naciśnięcie wstecz od głównego Czynność nie wyświetli listy Czynność
VinceFR

7
Czy jest jakiś szczególny powód, dla którego stosowany setFlags()z getFlags()zamiast Intent.addFlags()?
Sam

1
@VinceFR to jest dokładnie to, czego chcę! a -> b -> c i wróć bezpośrednio do c-
realtebo

90

W pliku manifestu dodaj:

android:noHistory="true" 

do czynności, której nie chcesz trzymać na stosie.


czy są jakieś różnice w stosunku do rozpoczęcia aktywności z flagą no_history?
realtebo

1
Jak powiedziałeś w swoim pytaniu, "każde otwarcie listy NIE ZAPISUJE się do 'historii'" Dlatego za każdym razem, gdy ponownie otworzysz swoją aplikację, przeniesie Cię to do głównego zadania
Marcin S.

@MarcinS. gdy aplikacji nie ma na liście ostatnich aplikacji, to nie działa. Czy możesz wyjaśnić, dlaczego tak się dzieje
Ajit Kumar Dubey

1
Jaka jest więc różnica między tymi dwoma podejściami (manifest i flaga)?
pumbosha

Podejście @pumbosha Manifest zawsze pozostawi tę aktywność poza historią. Podejście z flagą pozwala kontrolować to zachowanie w czasie wykonywania.
John Crawford

27

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


1
Byłoby świetnie, ale czy istnieje sposób na zatrzymanie szeroko zakrojonej animacji „zmieniającego się zadania” w systemie? Dodanie FLAG_ACTIVITY_NO_ANIMATION nie zapobiega temu, niestety!
androidguy

ma to wpływ na szybkość aplikacji?
Acauã Pitta

23

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();

Jeśli Twój telefon nie działa tak szybko, zobaczysz, że poprzednia aktywność odchodzi.
Nolan

@Nolan to tylko wtedy, gdy skończysz przed rozpoczęciem aktywności
Henrik Bøgelund Lavstsen,

7

W moim przypadku FLAG_ACTIVITY_NO_HISTORYnie zadziałało. Ani nie działały, FLAG_ACTIVITY_NEW_TASKani FLAG_ACTIVITY_CLEAR_TASKsame nie działały.

Jednak FLAG_ACTIVITY_NEW_TASKi FLAG_ACTIVITY_CLEAR_TASKrazem wyszło.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

4

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 :)


3

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))

2
Bardziej w stylu Kotlina: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

2

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);


-4

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);
}

6
Nie rób tego. Dopuszczalne jest przechwytywanie BACK w określonych celach, ale robienie tego wyłącznie w celu cichego zużywania prasy BACK i zapobiegania przerwaniu połączenia Activitynie jest dobrą praktyką.
Squonk,

1
Zgadzam się całkowicie ^ tylko opcja.
Broak,

1
Jest OnBackPressedna to.
Fred
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.