Lista zadań i stos wsteczny

Zadanie to zbiór działań, z którymi użytkownicy wchodzą w interakcję, gdy próbują wykonać jakąś czynność w aplikacji. Aktywności te są uporządkowane w stosie nazywanym stokiem wstecznym w kolejności, w jakiej są otwierane.

Na przykład aplikacja do poczty e-mail może mieć jedną aktywność, która wyświetla listę nowych wiadomości. Gdy użytkownik wybierze wiadomość, otworzy się nowa aktywność, w której ta wiadomość zostanie wyświetlona. Nowa aktywność zostanie dodana do stosu wstecznego. Następnie, gdy użytkownik kliknie Wstecz lub wskaże Wstecz, ta aktywność zakończy się i zostanie usunięta ze stosu.

Cykl życia zadania i jego stosu wstecznego

Ekran główny urządzenia to pierwsze miejsce wykonywania większości zadań. Gdy użytkownik dotknie ikony aplikacji lub skrótu w Menu z aplikacjami albo na ekranie głównym, zadanie tej aplikacji pojawi się na pierwszym planie. Jeśli dla aplikacji nie istnieje zadanie, tworzone jest nowe zadanie, a główna aktywność dla tej aplikacji otwiera się jako aktywność główna w stosie.

Gdy bieżące działanie rozpocznie inne, nowe działanie jest przekazywane na szczyt stosu i staje się fokusem. Poprzednia aktywność pozostaje w stosie, ale jest zatrzymana. Po zatrzymaniu działania system zachowuje bieżący stan swojego interfejsu. Gdy użytkownik wykona działanie wsteczne, bieżąca aktywność jest pobierana z góry stosu i niszczona. Poprzednia aktywność zostanie wznowiona i przywrócony zostanie poprzedni stan interfejsu użytkownika.

Działania w stosie nigdy nie są zmieniane, a jedynie są wypychane ze stosu i z niego pobierane po rozpoczęciu przez bieżące działanie, a następnie zamykane przez użytkownika za pomocą przycisku lub gestu Wstecz. Dlatego stos wsteczny działa jako struktura obiektów ostatnio, pierwszy w kolejności. Rysunek 1 przedstawia oś czasu, w której aktywności są umieszczane i przenoszone z tyłu stosu.

Rysunek 1. Ilustracja pokazująca, jak każda nowa aktywność w zadaniu dodaje element do stosu wstecznego. Gdy użytkownik kliknie lub zademonstruje Wstecz, bieżąca aktywność zostanie zniszczona, a poprzednie zostanie wznowione.

Gdy użytkownik nadal klika przycisk Wstecz lub wykonuje gest Wstecz, każda aktywność w stosie zostaje wydzielona i odkrywa poprzednią, dopóki użytkownik nie wróci do ekranu głównego lub innej aktywności uruchomionej w momencie rozpoczęcia zadania. Po usunięciu ze stosu wszystkich aktywności zadanie już nie istnieje.

Działanie kliknięcia wstecz w przypadku aktywności w głównym programie uruchamiającym

Działania głównego programu uruchamiającego to działania deklarujące filtr intencji przy użyciu zarówno ACTION_MAIN, jak i CATEGORY_LAUNCHER. Są one unikalne, ponieważ stanowią punkty wejścia do aplikacji z poziomu menu z aplikacjami i pozwalają uruchamiać zadania.

Gdy użytkownik klika lub wykonuje gest Wstecz w ramach aktywności w głównym programie uruchamiającym, system obsługuje zdarzenie w różny sposób w zależności od wersji Androida, na której działa urządzenie.

Zachowanie systemu na Androidzie 11 i starszych
System kończy działanie.
Zachowanie systemu na Androidzie 12 i nowszych

System przenosi aktywność i zadanie w tle, zamiast ją zakończyć. Odpowiada to domyślnemu działaniu systemu podczas opuszczenia aplikacji za pomocą przycisku lub gestu ekranu głównego.

W większości przypadków takie zachowanie oznacza, że użytkownicy mogą szybciej wznowić aplikację z stanu zimnego, zamiast całkowicie ją uruchamiać z stanu zimnego.

Jeśli musisz udostępnić niestandardową nawigację wsteczną, zalecamy skorzystanie z interfejsów API AndroidX Activity API zamiast zastępowania interfejsu onBackPressed(). Jeśli nie ma żadnych komponentów, które przechwytują takie kliknięcia, interfejsy AndroidX Activity API automatycznie dostosowują działanie systemu do odpowiedniego działania.

Jeśli jednak aplikacja zastępuje onBackPressed(), aby obsługiwać Wstecz, i dokończyć działanie, zaktualizuj implementację, aby wywoływała metodę super.onBackPressed() zamiast kończenia. Wywołanie super.onBackPressed() w razie potrzeby przenosi aktywność i zadanie w tle oraz zapewnia bardziej spójną nawigację w różnych aplikacjach.

Zadania w tle i na pierwszym planie

Rysunek 2. Dwa zadania: zadanie B otrzymuje interakcję użytkownika na pierwszym planie, a zadanie A jest w tle i oczekuje na wznowienie.

Zadanie to spójna jednostka, która może przenieść się do tle, gdy użytkownik rozpocznie nowe zadanie lub przejdzie na ekran główny. W tle wszystkie działania w zadaniu są zatrzymywane, ale wsteczny stos zadania pozostaje nienaruszony – w tym czasie traci ono skupienie, gdy trwa inne, jak widać na ilustracji 2. Zadanie może następnie powrócić na pierwszy plan, dzięki czemu użytkownicy będą mogli wznowić je od miejsca, w którym je przerwali.

Rozważmy taki przepływ zadań w ramach bieżącego zadania A, które ma na stosie 3 działania, w tym 2 w bieżącym działaniu:

  1. Użytkownik klika przycisk lub gest ekranu głównego, a potem uruchamia nową aplikację z menu z aplikacjami.

    Gdy pojawi się ekran główny, zadanie A przejdzie w tle. Gdy nowa aplikacja się uruchamia, system rozpoczyna dla niej zadanie (zadanie B) z własnym stosem działań.

  2. Po interakcji z tą aplikacją użytkownik wraca z powrotem na ekran główny i wybiera aplikację, która pierwotnie rozpoczęła zadanie A.

    Teraz na pierwszym planie pojawia się zadanie A – wszystkie 3 działania w stosie pozostają niezmienione, a aktywność u góry stosu zostanie wznowiona. W tym momencie użytkownik może też wrócić do zadania B, przechodząc na stronę główną i wybierając ikonę aplikacji, która rozpoczęła zadanie, lub wybierając zadanie aplikacji z ekranu Ostatnie.

Wiele wystąpień aktywności

Rysunek 3. Pojedyncza aktywność może zostać utworzona wiele razy.

Kolejność działań w stosie wstecznym nigdy nie jest zmieniana, więc jeśli Twoja aplikacja umożliwia użytkownikom rozpoczęcie określonej aktywności od więcej niż 1 działania, tworzona jest nowa instancja tej aktywności i przenoszona na stos, zamiast przenosić wszystkie wcześniejsze wystąpienia na początek. W związku z tym jedna instancja może być utworzona wiele razy, nawet z różnych zadań, jak widać na ilustracji 3.

Jeśli użytkownik przejdzie wstecz za pomocą przycisku lub gestu Wstecz, instancje aktywności zostaną ujawnione w kolejności, w jakiej zostały otwarte, każde z własnym stanem interfejsu. Możesz jednak zmienić to działanie, jeśli nie chcesz tworzyć instancji więcej niż raz. Więcej informacji na ten temat znajdziesz w sekcji o zarządzaniu zadaniami.

Środowiska z wieloma oknami

Gdy aplikacje działają jednocześnie w środowisku z wieloma oknami, które jest obsługiwane na Androidzie 7.0 (poziom interfejsu API 24) i nowszych, system zarządza zadaniami z osobna dla każdego okna z osobna. Każde okno może zawierać wiele zadań. To samo dotyczy aplikacji na Androida działających na Chromebookach: system zarządza zadaniami lub grupami zadań w odniesieniu do każdego okna.

Podsumowanie cyklu życia

Podsumowanie domyślnego działania działań i zadań:

  • Gdy Aktywność A rozpoczyna działanie B, zostaje ono zatrzymane, ale system zachowuje swój stan, np. pozycję przewijania i tekst wpisany w formularzach. Jeśli użytkownik kliknie lub użyje gestu Wstecz w Aktywności B, aktywność A zostanie wznowiona z przywróconym stanem.

  • Gdy użytkownik opuści zadanie za pomocą przycisku lub gestu ekranu głównego, bieżące działanie zostanie zatrzymane, a zadane zadanie przejdzie w tle. System zachowuje stan każdej aktywności w danym zadaniu. Jeśli później użytkownik wznowi zadanie, wybierając ikonę programu uruchamiającego, która je uruchomiła, zadanie znajdzie się na pierwszym planie i wznowi je u góry stosu.

  • Jeśli użytkownik kliknie lub wyświetli Wstecz, bieżąca aktywność zostanie usunięta ze stosu i zniszczona. Wznowienie poprzedniej aktywności w stosie. Po zniszczeniu aktywności system nie zachowuje jej stanu.

    Działa to inaczej w przypadku aktywności w głównym programie uruchamiającym, gdy aplikacja działa na urządzeniu z Androidem 12 lub nowszym.

  • Działania mogą być tworzone wiele razy, nawet z innych zadań.

Zarządzanie zadaniami

Android zarządza zadaniami i stokiem wstecznym, umieszczając wszystkie działania rozpoczęte po sobie w tym samym zadaniu, na końcu w stosie od pierwszego do pierwszego. Sprawdza się to w większości aplikacji i zwykle nie musisz martwić się o to, jak Twoje działania są powiązane z zadaniami ani jak znajdują się w tylnym stosie.

Możesz jednak przerwać normalne działanie. Możesz na przykład chcieć, aby aktywność w aplikacji rozpoczynała nowe zadanie w momencie jej uruchomienia, a nie była umieszczona w bieżącym zadaniu. Lub, gdy rozpoczynasz działanie, możesz przenieść jego istniejącą instancję, zamiast tworzyć nową na wierzchu stosu wstecznego. Możesz też chcieć, aby stos wsteczny był usuwany ze wszystkich działań z wyjątkiem aktywności na poziomie głównym, gdy użytkownik porzuci zadanie.

Te i inne działania możesz wykonywać za pomocą atrybutów w elemencie manifestu <activity> oraz flagach w intencji, którą przekazujesz do startActivity().

Oto atrybuty podmiotu zabezpieczeń <activity>, których możesz używać do zarządzania zadaniami:

Oto flagi intencji podmiotu zabezpieczeń, których możesz użyć:

W kolejnych sekcjach opisujemy, jak używać tych atrybutów pliku manifestu i flag intencji do definiowania sposobu powiązania działań z zadaniami i ich działania w stosie wstecznym.

Omówiono również sposób prezentowania zadań i działań i zarządzania nimi na ekranie Ostatnie. Zwykle pozwalasz systemowi zdefiniować, jak Twoje zadania i aktywności są reprezentowane na ekranie Ostatnie. Nie musisz więc niczego zmieniać. Więcej informacji znajdziesz w sekcji Ekran Ostatnie.

Zdefiniuj tryby uruchamiania

Tryby uruchamiania pozwalają określić, jak nowe wystąpienie działania ma być powiązane z bieżącym zadaniem. Tryby uruchamiania możesz zdefiniować na 2 sposoby opisane w sekcjach poniżej:

Jeśli więc działanie A rozpoczyna działanie B, może ono w swoim manifeście określić sposób jego powiązania z bieżącym zadaniem, a aktywność A może użyć flagi intencji, aby zażądać powiązania działania B z bieżącym zadaniem.

Jeśli obie aktywności określają sposób powiązania działania B z zadaniem, żądanie działania A, zgodnie z definicją w intencji, jest uwzględniane w żądaniu aktywności B, zgodnie z definicją w pliku manifestu.

Zdefiniuj tryby uruchamiania za pomocą pliku manifestu

Podczas deklarowania aktywności w pliku manifestu możesz określić sposób jej powiązania z zadaniem, korzystając z atrybutu launchMode w elemencie <activity>.

Do atrybutu launchMode możesz przypisać 5 trybów uruchamiania:

  1. "standard"
    Tryb domyślny. System tworzy nową instancję działania w zadaniu, od którego zostało rozpoczęte, i przekierowuje do niego intencję. Aktywność może być inicjowana wiele razy, każda instancja może należeć do różnych zadań, a jedno zadanie może mieć wiele instancji.
  2. "singleTop"
    Jeśli wystąpienie działania już istnieje na początku bieżącego zadania, system przekierowuje intencję do tej instancji przez wywołanie metody onNewIntent(), zamiast tworzyć nowe wystąpienie aktywności. Aktywność jest inicjowana wiele razy, każda instancja może należeć do różnych zadań, a jedno zadanie może mieć wiele instancji (ale tylko wtedy, gdy działanie na górze stosu wstecznego nie jest istniejącym wystąpieniem).

    Załóżmy na przykład, że stos wsteczny zadania składa się z aktywności głównej A, a na niej aktywności B, C i D (stos to więc A-B-C-D, z D na górze). Pojawia się intencja typu D. Jeśli grupa D ma domyślny tryb uruchamiania "standard", uruchamiana jest nowa instancja klasy, a stos staje się A-B-C-D-D. Jeśli jednak tryb uruchamiania D to "singleTop", istniejąca instancja D otrzymuje intencję przez onNewIntent(), ponieważ znajduje się na górze stosu, więc stos pozostaje A-B-C-D. Jeśli z drugiej strony pojawi się intencja typu B, to nowe wystąpienie obiektu B zostanie dodane do stosu, nawet jeśli tryb uruchamiania to "singleTop".

  3. "singleTask"
    System tworzy aktywność u góry nowego zadania lub znajduje aktywność w istniejącym zadaniu z tym samym podobieństwem. Jeśli wystąpienie działania już istnieje, system przekierowuje intencję do istniejącej instancji przez wywołanie metody onNewIntent(), zamiast tworzyć nową instancję. Tymczasem wszystkie pozostałe czynności na nim są niszczone.
  4. "singleInstance".
    Działanie jest takie samo jak w przypadku "singleTask" z tą różnicą, że system nie uruchamia żadnych innych działań w zadaniu, w którym znajduje się instancja. Aktywność jest zawsze jednym i jedynym członkiem swojego zadania. Wszystkie rozpoczęte przez nią działania otwierają się w osobnym zadaniu.
  5. "singleInstancePerTask".
    Aktywność może być uruchamiana tylko jako główna aktywność zadania, czyli pierwsza aktywność, która utworzyła zadanie. Dlatego może istnieć tylko 1 jej wystąpienie w zadaniu. W przeciwieństwie do trybu uruchamiania singleTask to działanie można rozpoczynać w wielu instancjach w różnych zadaniach, jeśli ustawiona jest flaga FLAG_ACTIVITY_MULTIPLE_TASK lub FLAG_ACTIVITY_NEW_DOCUMENT.

W kolejnym przykładzie aplikacja przeglądarki na Androida deklaruje, że aktywność przeglądarki zawsze otwiera się w ramach własnego zadania, określając w elemencie <activity> tryb uruchamiania singleTask. Oznacza to, że jeśli aplikacja zgłasza intencję otwarcia przeglądarki Androida, jej aktywność nie jest w tym samym zadaniu co aplikacja. Zamiast tego uruchamia się nowe zadanie dla przeglądarki lub, jeśli przeglądarka ma już zadanie uruchomione w tle, jest ono kierowane do obsługi nowej intencji.

Niezależnie od tego, czy działanie rozpoczyna się w nowym zadaniu, czy w tym samym zadaniu, które je zainicjowało, przycisk i gest Wstecz zawsze powodują przejście do poprzedniego działania. Jeśli jednak rozpoczniesz działanie, które określa tryb uruchamiania singleTask, a jego wystąpienie istnieje w zadaniu w tle, całe to zadanie zostanie przeniesione na pierwszy plan. W tym momencie stos wsteczny zawiera wszystkie działania z zadania przeniesionego na początek stosu. Ten scenariusz przedstawia Rysunek 4.

Rysunek 4. Sposób dodawania aktywności w trybie uruchamiania "singleTask" do stosu wstecznego. Jeśli aktywność jest już częścią zadania w tle z własnym stosem wstecznym, wtedy cały stos wsteczny również jest wyświetlany na początku bieżącego zadania.

Więcej informacji o używaniu trybów uruchamiania w pliku manifestu znajdziesz w dokumentacji elementu <activity>.

Zdefiniuj tryby uruchamiania za pomocą flag intencji

Gdy rozpoczynasz działanie, możesz zmienić domyślne powiązanie go z zadaniem, dodając do niego flagi w intencji, którą dostarcza startActivity(). Flagi, których możesz użyć do zmiany domyślnego działania, to:

FLAG_ACTIVITY_NEW_TASK

System rozpocznie aktywność w nowym zadaniu. Jeśli zadanie jest już uruchomione w związku z już uruchamianym działaniem, jest ono wyświetlane na pierwszym planie i ma przywrócony ostatni stan, a aktywność otrzymuje nową intencję w narzędziu onNewIntent().

Powoduje to takie samo działanie jak wartość "singleTask" launchMode omówiona w poprzedniej sekcji.

FLAG_ACTIVITY_SINGLE_TOP

Jeśli inicjowane działanie jest bieżącą aktywnością, w górnej części wstecznego stosu, obecna instancja otrzymuje wywołanie onNewIntent() zamiast tworzenia nowego wystąpienia aktywności.

Powoduje to takie samo działanie jak wartość "singleTop" launchMode omówiona w poprzedniej sekcji.

FLAG_ACTIVITY_CLEAR_TOP

Jeśli inicjowane działanie jest już uruchomione w bieżącym zadaniu, to zamiast uruchamiać nową instancję tego działania, system niszczy pozostałe aktywności. Intencja jest przekazywana do wznowionej instancji aktywności, która znajduje się teraz na górze, przez funkcję onNewIntent().

Nie ma wartości atrybutu launchMode, które powoduje to zachowanie.

FLAG_ACTIVITY_CLEAR_TOP jest najczęściej używany w połączeniu z właściwością FLAG_ACTIVITY_NEW_TASK. Używane razem, flagi lokalizują istniejącą aktywność w innym zadaniu i umieszczają ją w miejscu, w którym może zareagować na intencję.

Obsługuj podobne zainteresowania

Podobne zainteresowania wskazuje zadanie, do którego „preferuje” dana aktywność. Domyślnie wszystkie działania z tej samej aplikacji są do siebie podobne: „preferują”, aby były związane z tym samym zadaniem.

Możesz jednak zmodyfikować domyślne podobieństwo aktywności. Aktywności zdefiniowane w różnych aplikacjach mogą mieć wspólne zainteresowania, a aktywności zdefiniowane w tej samej aplikacji mogą mieć przypisane różne podobne zainteresowania.

Koligację aktywności możesz zmodyfikować, korzystając z atrybutu taskAffinity elementu <activity>.

Atrybut taskAffinity przyjmuje wartość ciągu, która musi być inna niż domyślna nazwa pakietu zadeklarowana w elemencie <manifest>, ponieważ system używa tej nazwy do identyfikowania domyślnej grupy zadań związanych z aplikacją.

O podobnych zainteresowaniach ma miejsce w 2 przypadkach:

  1. Gdy intencja uruchamiająca działanie zawiera flagę FLAG_ACTIVITY_NEW_TASK.

    Domyślnie w zadaniu o nazwie startActivity() jest uruchamiana nowa aktywność. Jest wypchana na ten sam stos co element wywołujący.

    Jeśli jednak intencja przekazana do startActivity() zawiera flagę FLAG_ACTIVITY_NEW_TASK, system szuka innego zadania do przechowywania nowej aktywności. Często jest to nowe zadanie. Jednak nie musi. Jeśli istnieje już zadanie o tym samym podobieństwie co nowa aktywność, zostanie ono w nim uruchomione. Jeśli tego nie zrobisz, rozpocznie się nowe zadanie.

    Jeśli ta flaga powoduje, że działanie rozpoczyna nowe zadanie, a użytkownik opuszcza je za pomocą przycisku ekranu głównego lub gestu, musi mieć możliwość powrotu do zadania. Niektóre elementy, np. menedżer powiadomień, zawsze rozpoczynają działania w zadaniach zewnętrznych, a nigdy nie wchodzą w skład własnych. Dlatego zawsze umieszczają obiekt FLAG_ACTIVITY_NEW_TASK w intencjach przekazywanych do startActivity().

    Jeśli element zewnętrzny, który może użyć tej flagi, może wywołać Twoją aktywność, zadbaj o to, aby użytkownik mógł wrócić do rozpoczętego zadania w niezależny sposób, np. używając ikony programu uruchamiającego, gdzie aktywność na poziomie głównym zadania zawiera filtr intencji CATEGORY_LAUNCHER. Więcej informacji znajdziesz w sekcji o rozpoczynaniu zadań.

  2. Gdy atrybut allowTaskReparenting aktywności ma wartość "true".

    W tym przypadku działanie może zostać przeniesione z zadania, w którym się rozpoczęło, do zadania, do którego ma koligację, gdy pojawi się na pierwszym planie.

    Załóżmy np., że aktywność, która raportuje warunki pogodowe w wybranych miastach, jest zdefiniowana jako część aplikacji turystycznej. Działa podobnie jak inne aktywności w tej samej aplikacji, ma tę samą domyślną kategorię podobieństwa i może zostać ponownie oznaczona jako nadrzędna za pomocą tego atrybutu.

    Gdy jedna z Twoich aktywności rozpoczyna aktywność związaną z raportowaniem pogody, początkowo należy ona do tego samego zadania co Twoja aktywność. Jeśli jednak zadanie aplikacji turystycznej jest na pierwszym planie, aktywność związana z raportowaniem pogody jest przypisywana do niego i wyświetlana w tym zadaniu.

Wyczyść stos wsteczny

Jeśli użytkownik opuści zadanie na dłuższy czas, system usunie je ze wszystkich aktywności oprócz tej głównej. Gdy użytkownik wróci do zadania, zostanie przywrócona tylko aktywność na poziomie głównym. System działa w ten sposób na podstawie założenia, że po upływie dłuższego czasu użytkownicy porzucili swoje poprzednie czynności i wracali do zadania, aby rozpocząć coś nowego.

Istnieją niektóre atrybuty aktywności, za pomocą których możesz zmodyfikować takie działanie:

alwaysRetainTaskState
Gdy ten atrybut ma wartość "true" w głównej aktywności zadania, opisywane domyślne zachowanie nie występuje. Zadanie zachowuje wszystkie aktywności na stosie nawet po długim czasie.
clearTaskOnLaunch

Gdy ten atrybut ma wartość "true" w głównej aktywności zadania, za każdym razem, gdy użytkownik porzuci zadanie i do niego wraca, jest ono usuwane aż do tej aktywności. Inaczej mówiąc, jest przeciwieństwem alwaysRetainTaskState. Użytkownik zawsze wraca do zadania w stanie początkowym, nawet jeśli na chwilę je opuści.

finishOnTaskLaunch

Ten atrybut przypomina atrybut clearTaskOnLaunch, ale działa na jednej aktywności, a nie na całym zadaniu. Może to też spowodować zakończenie dowolnej aktywności oprócz głównej. Jeśli ma wartość "true", aktywność pozostaje częścią zadania tylko przez bieżącą sesję. Jeśli użytkownik opuści zadanie, a potem wróci do zadania, zadanie nie będzie już widoczne.

Rozpocznij zadanie

Możesz ustawić aktywność jako punkt wejścia dla zadania, ustawiając dla niej filtr intencji z "android.intent.action.MAIN" jako określonym działaniem i "android.intent.category.LAUNCHER" jako z określoną kategorią:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

Po zastosowaniu tego filtra intencji w menu z aplikacjami wyświetla się ikona i etykieta działania. Dzięki temu użytkownicy mogą uruchomić działanie i wrócić do niego w dowolnym momencie po uruchomieniu.

Ta druga umiejętność jest bardzo ważna. Użytkownicy muszą mieć możliwość opuszczenia zadania i wrócić do niego później za pomocą tego menu z aplikacjami. Dlatego używaj tylko 2 trybów uruchamiania, które oznaczają działania jako zawsze inicjujące zadanie ("singleTask" i "singleInstance"), gdy aktywność ma filtr ACTION_MAIN i CATEGORY_LAUNCHER.

Wyobraźmy sobie na przykład, co mogłoby się stać, gdyby zabrakło filtra: zamiar uruchamia działanie "singleTask" i inicjuje nowe zadanie, a użytkownik spędza na nim trochę czasu. Następnie używa przycisku ekranu głównego lub gestu. Zadanie będzie teraz wysyłane w tle i nie będzie widoczne. Teraz użytkownik nie może wrócić do zadania, ponieważ zadanie to nie jest widoczne w Menu z aplikacjami.

Jeśli nie chcesz, aby użytkownik mógł wrócić do aktywności, w elemencie <activity> finishOnTaskLaunch ustaw wartość "true". Więcej informacji znajdziesz w sekcji na temat czyszczenia stosu wstecznego.

Więcej informacji o tym, jak zadania i działania są przedstawiane i zarządzane na ekranie Ostatnie, znajdziesz na ekranie Ostatnie.

Więcej materiałów