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.