Zmiany stanu aktywności

Różne zdarzenia, niektóre wywoływane przez użytkownika, a inne przez system, mogą powodować przełączanie stanu Activity z jednego stanu na drugi. W tym dokumencie opisujemy kilka typowych przypadków, w których następuje takie zmiany, oraz sposoby postępowania w takich przypadkach.

Więcej informacji o stanach aktywności znajdziesz w artykule Cykl życia aktywności. Więcej informacji o tym, jak klasa ViewModel może pomóc w zarządzaniu cyklem życia aktywności, znajdziesz w omówieniu ViewModel.

Następuje zmiana konfiguracji

Zmiana konfiguracji może być wywołana przez szereg zdarzeń. Jednym z najbardziej widocznych przykładów jest zmiana orientacji między pionową a poziomą. Zmiany w konfiguracji mogą też powodować zmiany ustawień języka lub urządzenia wejściowego.

Gdy nastąpi zmiana konfiguracji, działanie jest niszczone i odtworzone. Spowoduje to aktywowanie tych wywołań zwrotnych w pierwotnej instancji aktywności:

  1. onPause()
  2. onStop()
  3. onDestroy()

Zostanie utworzone nowe wystąpienie aktywności i wywołane zostaną te wywołania zwrotne:

  1. onCreate()
  2. onStart()
  3. onResume()

Użyj kombinacji instancji ViewModel, metody onSaveInstanceState() lub stałej pamięci lokalnej, aby zachować stan interfejsu użytkownika działania po zmianie konfiguracji. Decyzja o tym, jak połączyć te opcje, zależy od złożoności danych UI, przypadków użycia aplikacji oraz szybkości pobierania w porównaniu z wykorzystaniem pamięci. Więcej informacji o zapisywaniu stanu interfejsu aktywności znajdziesz w artykule Zapisywanie stanów interfejsu użytkownika.

Obsługa etui z wieloma oknami

Gdy aplikacja przechodzi w tryb wielu okien, dostępny na Androidzie 7.0 (poziom interfejsu API 24) i nowszych, system powiadamia o aktywnej aktywności związanej ze zmianą konfiguracji, przechodząc w ten sposób przez opisane wcześniej przejścia cyklu życia.

Dzieje się tak również wtedy, gdy zmieni się rozmiar aplikacji, która już działa w trybie wielu okien. Aktywność może obsłużyć zmianę konfiguracji lub może pozwolić systemowi na zniszczenie aktywności i odtworzenie jej w nowych wymiarach.

Więcej informacji o cyklu trybu wielu okien znajdziesz w opisie cyklu trybu wielu okien na stronie Obsługa wielu okien.

Mimo że w trybie wielu okien istnieją 2 aplikacje, które są widoczne dla użytkownika, tylko ta, z którą użytkownik wchodzi w interakcję, działa na pierwszym planie i jest aktywna. Ta aktywność jest w stanie wznowiona, a aplikacja w innym oknie jest wstrzymana.

Gdy użytkownik przełączy się z aplikacji A na aplikację B, system wywoła metodę onPause() w aplikacji A i onResume() w aplikacji B. Przełącza się między tymi 2 metodami za każdym razem, gdy użytkownik przełącza się między aplikacjami.

Więcej informacji o trybie wielu okien znajdziesz w artykule Obsługa wielu okien.

Aktywność lub okno jest widoczne na pierwszym planie

Jeśli na pierwszym planie pojawi się nowe działanie lub okno, które będzie zajmować aktywność i częściowo zakryć trwającą aktywność, ta aktywność utraci zaznaczenie i przejdzie w stan wstrzymania. Następnie system wywoła metodę onPause().

Gdy pokryta aktywność wróci na pierwszy plan i ponownie się aktywuje, system wywoła funkcję onResume().

Jeśli na pierwszym planie pojawi się nowe działanie lub okno, które będzie aktywne i całkowicie zasłaniające trwające działanie, aktywność przestanie być zaznaczona i przejdzie do stanu Zatrzymana. System szybko po kolei wywołuje funkcje onPause() i onStop().

Gdy ta sama instancja uwzględnionej aktywności wrócą na pierwszy plan, system wywoła działanie onRestart(), onStart() i onResume(). Jeśli jest to nowa instancja objętej aktywności, która pojawia się w tle, system nie wywołuje funkcji onRestart(), tylko onStart() i onResume().

Użytkownik klika lub wykonuje gesty Wstecz

Jeśli aktywność jest na pierwszym planie, a użytkownik kliknie lub wyświetli gest Wstecz, zostanie ona przeniesiona przez wywołania zwrotne onPause(), onStop() i onDestroy(). Aktywność zostanie zniszczona i usunięta ze stosu.

Domyślnie w takim przypadku wywołanie zwrotne onSaveInstanceState() nie jest uruchamiane. Przyjęto tu założenie, że użytkownik klika Wstecz i nie oczekuje, że wróci do tego samego wystąpienia aktywności.

Możesz jednak zastąpić metodę onBackPressed(), aby zaimplementować niestandardowe zachowanie, np. wyświetlenie okna z prośbą o potwierdzenie zamknięcia aplikacji.

Jeśli zastąpisz metodę onBackPressed(), zdecydowanie zalecamy dalsze wywoływanie metody super.onBackPressed() z poziomu zastąpionej metody. W przeciwnym razie zachowanie systemowego cofania może być drażliwe dla użytkownika.

System wyłącza proces aplikacji

Jeśli aplikacja działa w tle, a system musi zwolnić pamięć dla aplikacji działającej w tle, system może zamknąć aplikację działającą w tle. Gdy system zamyka aplikację, nie ma gwarancji, że funkcja onDestroy() zostanie w niej wywołana.

Więcej informacji o tym, jak system decyduje, które procesy zniszczyć, znajdziesz w artykułach Stan aktywności i wyrzucanie z pamięci oraz Procesy i cykl życia aplikacji.

Aby dowiedzieć się, jak zapisać stan interfejsu aktywności, gdy system zamknie proces aplikacji, zapoznaj się z sekcją Zapisywanie i przywracanie tymczasowego stanu interfejsu.