Na Androidzie 9 (i starszych) aplikacje były zmieniane w stan PAUSED
, gdy:
- nowa, półprzezroczysta aktywność uruchomiona na górze aplikacji, gdy aplikacja była nadal widoczna (a zatem nie została zatrzymana);
- Aktywność przestała być ukierunkowana, ale była niezasłonięta i użytkownik mógł wchodzić z nią w interakcję. Na przykład w trybie wielu okien można wyświetlać wiele aktywności i jednocześnie obsługiwać dotykowe wprowadzanie danych.
Różnica między tymi sytuacjami polega na tym, jak długo aplikacja musi być wstrzymana, ale nie można tego odróżnić na poziomie aplikacji.
W Androidzie 10 wszystkie działania, których zaznaczenie można zaznaczyć w widocznych stosach, znajdują się w stanie RESUMED
. Dzięki temu zwiększa się zgodność z trybami wiele okien i MD w przypadku aplikacji, które używają funkcji onPause()
zamiast onStop()
, aby zatrzymać odświeżanie interfejsu i interakcje z użytkownikiem. Oznacza to, że:
- Obie aktywności w podzielonym ekranie zostaną wznowione.
- Wszystkie widoczne na górze aktywności w trybie okna swobodnego są wznawiane.
- Działania na wielu ekranach mogą być wznawiane jednocześnie.
Rysunek 1. Jednoczesne wznowienie na składanym urządzeniu
Rysunek 2. Wielokrotne wznawianie w trybie pulpitu
Aktywności mogą mieć stan PAUSED
, gdy nie można się na nich skupić lub są częściowo zasłonięte, na przykład:
- W minimalizowanym trybie podzielonego ekranu (z uruchomionym laucherem po bokach) górna aktywność nie jest wznawiana, ponieważ nie można jej wybrać.
- W trybie obrazu w obrazie aktywność nie jest wznawiana, ponieważ nie można jej ustawić w centrum.
- Gdy działania są objęte innymi przejrzystymi działaniami w tym samym zbiorze.
Ta metoda wskazuje aplikacje, że działanie może otrzymywać dane wejściowe od użytkownika tylko w stanie RESUMED
. Przed Androidem 10 aktywności mogły też otrzymywać dane wejściowe w stanie PAUSED
(na przykład na urządzeniu z Androidem 9 można było dotykać obu aktywności jednocześnie na podzielonym ekranie).
Aby zachować sygnał resumed z poprzednich wersji Androida (oraz aby informować, kiedy aplikacje powinny uzyskać dostęp do zasobów z dostępem wyłącznym lub pojedynczym), Android 10 zawiera nowy wywołanie zwrotne:
Activity#onTopResumedActivityChanged(boolean onTop)
Gdy zostanie wywołany, ten podany przez użytkownika adres wywołuje się między Activity#onResume()
a Activity#onPause()
. Ten wywołanie zwrotne jest opcjonalne i może zostać pominięty,
tak aby aktywność mogła przejść ze stanu RESUMED
do stanu PAUSED
bez awansowania do najwyższego poziomu w systemie. na przykład w trybie wielu okien.
Ponieważ ten wywołanie zwrotne jest opcjonalne, nie jest częścią cyklu życia aktywności i powinno być używane rzadko.
Poprzednia wznowiona aktywność otrzymuje i kończy wykonywanie onTopResumedActivity(false)
, zanim następna wznowiona aktywność otrzymuje onTopResumedActivity(true)
, chyba że poprzednia aktywność zajmuje zbyt dużo czasu na obsłużenie wywołania metody i wygeneruje limit czasu 500 ms.
Zgodność
Aby zachować zgodność podczas wdrażania funkcji wielu CV, rozważ te rozwiązania.
Wiele wznowionych działań w ramach jednego procesu aplikacji
- Problem. W Androidzie 9 i starszych tylko jedna aktywność w systemie jest wznawiana w danym momencie. Wszystkie przejścia między aktywnościami wymagają wstrzymania jednej aktywności przed wznowieniem innej. Niektóre aplikacje i frameworki (np. Flutter czy LocalActivityManager w Androidzie) korzystają z tego faktu i przechowują stan wznowionej aktywności w klasach singleton.
- Rozwiązanie: W Androidzie 9 i starszych, jeśli 2 aktywności z tego samego procesu zostaną wznowione, system wznowi tylko tę aktywność, która ma wyższą pozycję w kolejności Z. Aplikacje kierowane na Androida 10 mogą obsługiwać wiele aktywności wznawianych jednocześnie.
jednoczesny dostęp do kamery,
- Problemy. Problemy te występują też w Androidzie 9 i starszych wersjach. Na przykład aktywność w trybie pełnoekranowym może stracić fokus kamery na rzecz zawieszonej aktywności na górze w trybie obrazu w obrazie, ale może też stać się bardziej widoczna dzięki szerszemu wdrożeniu trybów wielu okien i wielu wyświetlaczy.
- Z powodu zmian wprowadzonych w stanie
RESUME
aplikacje mogą zostać odłączone od kamery nawet po wznowieniu. Aby rozwiązać ten problem, aplikacje muszą obsługiwać odłączenie kamery bez zawieszania się. Po rozłączeniu aplikacje otrzymują wywołanie po rozłączeniu, a wszystkie wywołania interfejsu API zaczynają rzucać błądCameraAccessException
. resizeableActivity=false
nie gwarantuje wyłącznego dostępu do aparatu, ponieważ inne aplikacje korzystające z aparatu mogą być otwierane na innych wyświetlaczach.
- Z powodu zmian wprowadzonych w stanie
- Rozwiązania Deweloperzy powinni uwzględnić logikę, która będzie działać, gdy aplikacja zostanie odłączona od kamery. Gdy aplikacja zostanie odłączona od kamery, powinna obserwować wywołania zwrotne jej dostępności, aby spróbować połączyć się ponownie i dalej korzystać z kamery. Oprócz dotychczasowego wywołania
CameraManager#AvailabilityCallback#onCameraAvailable()
w Androidzie 10 dodano wywołanieCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
, które obejmuje przypadek, gdy punkt skupienia (i priorytet aparatu) przełącza się między kilkoma wznowionymi aktywnościami. Deweloperzy aplikacji powinni używać obu tych funkcji zwracania wywołań zwrotnych, aby określić odpowiedni moment na próbę uzyskania dostępu do aparatu.
Wielokrotne wznowienie
W Androidzie 10 stan cyklu życia aktywności jest określany przez widoczność i porządek warstw (Z-order). Aby zapewnić prawidłowy stan po aktualizacji widoczności aktywności i oceniać, który stan cyklu życia jest odpowiedni, wywołuj metodę ActivityRecord#makeActiveIfNeeded()
z różnych lokalizacji. W Androidzie 10 aktywny oznacza RESUMED
lub PAUSED
i działa tylko w tych 2 przypadkach.
W Androidzie 10 wznowienie działania jest śledzone oddzielnie w każdym stosie zamiast w jednej lokalizacji w systemie. Wynika to z tego, że w trybie wielu okien można wykonywać jednocześnie kilka przejść między aktywnościami. Więcej informacji znajdziesz w artykule ActivityStack#mInResumeTopActivity
.
wywołanie z aktywności wznawianej od początku
Po działaniach, które mogą spowodować zmianę głównej aktywności (takich jak uruchomienie, wznowienie lub zmiana kolejności Z), wywoływana jest funkcja ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
. Ta metoda sprawdza, czy zmieniła się ostatnio wznowiona aktywność, i w razie potrzeby ją aktualizuje. Jeśli poprzednia aktywność z najwyższym poziomem wznowienia nie zwolniła stanu najwyższego poziomu wznowienia, zostanie do niej wysłana wiadomość o utracie stanu najwyższego poziomu wznowienia, a na stronie serwera zostanie zaplanowany limit czasu (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
). Raport o stanie najwyższego poziomu wznowienia zostanie wysłany do następnej aktywności po zwolnieniu stanu przez poprzednią aktywność lub po przekroczeniu limitu czasu (patrz:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Dodano nowy element transakcji TopResumedActivityChangeItem
, aby zgłaszać klientom zmiany stanu „w poprzednim stanie” i wykorzystywać architekturę ActivityLifecycler
z Androida 9.
Stan „w poprzednim stanie” jest przechowywany po stronie klienta, a za każdym razem, gdy aktywność przechodzi do stanu RESUMED
lub PAUSED
, sprawdzana jest też kwestia, czy należy wywołać funkcję onTopResumedActivityChanged()
. Umożliwia to pewne odłączenie komunikacji stanów cyklu życia i stanu wznowienia w tle między serwerem a klientem.