W Androidzie 9 (i starszych) aplikacje przechodziły 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ść straciła na znaczeniu, ale nie została zasłonięta i użytkownik mógł z nią wchodzić w interakcję. Na przykład w trybie wielu okien można wyświetlać kilka aktywności i jednocześnie obsługiwać je za pomocą ekranu dotykowego.
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 czynności, które można skupić na górze w widocznych grupach, znajdują się w stanie RESUMED
. Dzięki temu zwiększysz zgodność z trybami wiele okien i MD w przypadku aplikacji, które używają 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 ekranu aktywności w trybie okna swobodnego są wznawiane.
- Działania na wielu ekranach mogą być wznawiane jednocześnie.
Rysunek 1. Jednoczesne wznowienie na urządzeniu składanym
Rysunek 2. Wielokrotne wznowienie w trybie komputera
Aktywności mogą mieć stan PAUSED
, gdy nie można się na nich skupić lub są częściowo zasłonięte, na przykład:
- Na zminimalizowanym ekranie podzielonym (z widocznym panelem sterowania po bokach) nie można wznowić górnego działania, ponieważ nie można go 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.
Takie podejście wskazuje aplikacjom, że aktywność 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 wyłącznie lub pojedynczych zasobów), Android 10 zawiera nowy wywołanie zwrotne:
Activity#onTopResumedActivityChanged(boolean onTop)
Gdy zostanie wywołany, wywołanie zwrotne zostanie wykonane w okresie od Activity#onResume()
do 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 aktywność z najwyższym priorytetem otrzymuje i kończy wykonywanie instrukcji onTopResumedActivity(false)
, zanim następna aktywność z najwyższym priorytetem otrzymuje onTopResumedActivity(true)
, chyba że poprzednia aktywność potrzebuje zbyt dużo czasu na obsłużenie wywołania metody i przekroczy 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 i wznowienia innej. Niektóre aplikacje i ramki (np. Flutter lub LocalActivityManager Androida) korzystają z tego faktu i przechowują stan wznowionej aktywności w klasach pojedynczych.
- 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 uruchamianych jednocześnie.
jednoczesny dostęp do kamery,
- Problemy. Te problemy występują też na 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łączanie kamery bez zawieszania się. Po rozłączeniu aplikacje otrzymują wywołanie zwrotne 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. Jeśli aplikacja utraci połączenie z kamerą, powinna sprawdzać wywołania zwrotne dotyczące dostępności kamery, aby spróbować ponownie połączyć się z kamerą i kontynuować jej używanie. Oprócz dotychczasowego wywołania zwrotnego
CameraManager#AvailabilityCallback#onCameraAvailable()
w Androidzie 10 dodano wywołanie zwrotneCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
, które obejmuje przypadki, 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 kolejność. 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 stan aktywny oznacza stan RESUMED
lub PAUSED
i działa tylko w tych 2 przypadkach.
W Androidzie 10 wznawianie aktywności jest śledzone osobno w każdej warstwie zamiast w jednym miejscu w systemie. Wynika to stąd, ż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 poziomu aktywności wznawianej
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ę najwyższa wznowiona aktywność, i w razie potrzeby wykonuje aktualizację. 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 od strony serwera i klienta.