Różne zdarzenia, niektóre wywoływane przez użytkownika, a inne przez system, mogą powodować przejście
Activity z jednego stanu do drugiego. W tym dokumencie opisujemy niektóre typowe przypadki, w których takie przejścia mają miejsce, oraz sposób ich obsługi.
Więcej informacji o stanach aktywności znajdziesz w artykule Cykl życia aktywności. Aby dowiedzieć się, jak klasa ViewModel może pomóc w zarządzaniu cyklem życia działania, przeczytaj artykuł Omówienie ViewModel.
W przypadku większości zmian aktywności nie musisz bezpośrednio odpowiadać na wywołania zwrotne w cyklu życia aktywności. Ponieważ Compose ponownie tworzy interfejsy użytkownika na podstawie stanu, możesz skorzystać z automatycznej rekompozycji, przechowując stan w odpowiednim miejscu, np. w rememberSaveable lub ViewModel.
Zmiana konfiguracji
Istnieje wiele zdarzeń, które mogą spowodować zmianę konfiguracji. Najbardziej znanym przykładem jest zmiana orientacji ekranu z pionowej na poziomą. Inne przypadki, które mogą spowodować zmiany konfiguracji, to zmiany ustawień języka lub urządzenia wejściowego.
Gdy nastąpi zmiana konfiguracji, aktywność zostanie zniszczona i utworzona ponownie. Spowoduje to wywołanie tych wywołań zwrotnych w pierwotnej instancji aktywności:
Zostanie utworzona nowa instancja aktywności i zostaną wywołane te wywołania zwrotne:
W Compose nie jest typowe bezpośrednie wchodzenie w interakcję z tymi wywołaniami zwrotnymi. Zamiast tego użyj interfejsu API cyklu życia, aby obserwować zmiany stanu. W Compose możesz użyć LocalLifecycleOwner.current, aby uzyskać bieżący cykl życia i dodać obserwatora, co pozwoli Ci reagować na zdarzenia.
Aby zachować stan interfejsu użytkownika aktywności podczas zmian konfiguracji, użyj kombinacji instancji ViewModel, rememberSaveable lub trwałego lokalnego miejsca na dane.
Decyzja o tym, jak połączyć te opcje, zależy od złożoności danych interfejsu użytkownika, przypadków użycia aplikacji oraz szybkości pobierania w porównaniu z wykorzystaniem pamięci. W większości przypadków użycia stan należy przenieść do ViewModel i użyć rememberSaveable, aby zapewnić jego trwałość zarówno podczas zmian konfiguracji, jak i w przypadku śmierci procesu zainicjowanej przez system. Więcej informacji o zapisywaniu
stanu interfejsu użytkownika aktywności znajdziesz w artykule Zapisywanie stanów interfejsu użytkownika.
Gdy aktywność zostanie utworzona ponownie z powodu zmiany konfiguracji, początkowa kompozycja zostanie usunięta. Użycie ViewModel lub rememberSaveable zapewnia przywrócenie stanu interfejsu użytkownika w nowej kompozycji.
Więcej informacji znajdziesz w artykułach Cykl życia w Jetpack Compose oraz Stan i Jetpack Compose.
Obsługa przypadków wielu okien
Gdy aplikacja przechodzi w tryb wielu okien, dostępny w Androidzie 7.0 (poziom interfejsu API 24) i nowszych wersjach, system powiadamia działającą aktywność o zmianie konfiguracji, co powoduje przejście przez opisane wcześniej przejścia cyklu życia.
To zachowanie występuje również wtedy, gdy rozmiar aplikacji, która jest już w trybie wielu okien, zostanie zmieniony. Aktywność może samodzielnie obsługiwać zmianę konfiguracji lub zezwolić systemowi na zniszczenie i ponowne utworzenie aktywności z nowymi wymiarami.
Więcej informacji o cyklu życia w trybie wielu okien znajdziesz w wyjaśnieniu cyklu życia w trybie wielu okien w artykule Obsługa trybu wielu okien.
W trybie wielu okien, mimo że użytkownik widzi 2 aplikacje, tylko ta, z którą wchodzi w interakcję, jest na pierwszym planie i ma fokus. Ta aktywność jest w stanie wznowienia, a aplikacja w drugim oknie jest w stanie wstrzymania.
Gdy użytkownik przełącza się z aplikacji A na aplikację B, system wywołuje 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 trybu wielu okien.
Aktywność lub okno dialogowe pojawia się na pierwszym planie
Jeśli na pierwszym planie pojawi się nowa aktywność lub okno dialogowe, które przejmie fokus i częściowo zasłoni aktywność w toku, zasłonięta aktywność utraci fokus i przejdzie w stan wstrzymania. Następnie system wywoła w niej onPause.
Gdy zasłonięta aktywność wróci na pierwszy plan i odzyska fokus, the
system calls onResume.
Jeśli na pierwszym planie pojawi się nowa aktywność lub okno dialogowe, które przejmie fokus i całkowicie zasłoni aktywność w toku, zasłonięta aktywność utraci fokus i przejdzie w stan zatrzymania. Następnie system szybko wywoła
onPause i onStop.
Gdy ta sama instancja zasłoniętej aktywności wróci na pierwszy plan, system wywoła w niej onRestart, onStart i onResume. Jeśli na pierwszy plan przejdzie nowa instancja zasłoniętej aktywności, system nie wywoła onRestart, tylko onStart i onResume.
Pojawianie się okien dialogowych na pierwszym planie nie ma wpływu na rekompozycję. Jednak
efekty uboczne związane z cyklem życia, takie jak przepływy i animacje, powinny korzystać z
interfejsów API uwzględniających cykl życia (np. collectAsStateWithLifecycle), aby
w razie potrzeby automatycznie wstrzymywać i wznawiać działanie. Więcej informacji znajdziesz w artykule Stan
i Jetpack Compose.
Użytkownik klika lub wykonuje gest Wstecz
Jeśli aktywność jest na pierwszym planie, a użytkownik kliknie lub wykona gest Wstecz, the
activity przejdzie przez wywołania zwrotne onPause, onStop, and
onDestroy. Aktywność zostanie zniszczona i usunięta ze stosu wstecznego.
W aplikacji z jedną aktywnością, takiej jak większość aplikacji Compose, rememberSaveable nie zachowa stanu, jeśli element kompozycyjny zostanie usunięty ze stosu wstecznego nawigacji. Dzieje się tak, ponieważ gdy użytkownik kliknie przycisk Wstecz, nie oczekuje, że wróci do tej samej instancji, więc cały stan zostanie wyczyszczony.
Aby zaimplementować niestandardowe zachowanie przycisku Wstecz, np. wyświetlić okno dialogowe z prośbą o potwierdzenie, że użytkownik chce zamknąć aplikację, użyj interfejsu API NavigationEventHandler.
System zamyka proces aplikacji
Jeśli aplikacja działa w tle, a system musi zwolnić pamięć na potrzeby aplikacji na pierwszym planie, może zamknąć aplikację w tle. Gdy system zamyka aplikację, nie ma gwarancji, że w aplikacji zostanie wywołana metoda onDestroy.
Aby dowiedzieć się więcej o tym, jak system decyduje, które procesy zniszczyć, przeczytaj Stan działania i usuwanie z pamięci oraz Procesy i cykl życia aplikacji.
Aby dowiedzieć się, jak zapisać stan interfejsu użytkownika aktywności, gdy system zamknie proces aplikacji , przeczytaj artykuł Zapisywanie i przywracanie tymczasowego stanu interfejsu użytkownika.