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:
Zostanie utworzone nowe wystąpienie aktywności i wywołane zostaną te wywołania zwrotne:
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.