Wiele CV

W systemie Android 9 (i starszych) aplikacje przechodziły w stan PAUSED , gdy:

  • Nowa, przezroczysta aktywność została uruchomiona na aplikacji, gdy aplikacja była nadal widoczna (i dlatego nie została zatrzymana).
  • Aktywność straciła ostrość, ale była niezasłonięta i użytkownik mógł z nią wchodzić w interakcję. Na przykład w trybie wielu okien można jednocześnie widzieć wiele działań i odbierać je za pomocą dotyku.

Sytuacje te różnią się ilością wstrzymań , jakie musi wykonać aplikacja, ale nie można ich rozróżnić na poziomie aplikacji.

W systemie Android 10 wszystkie działania, na których można się skupić, w widocznych stosach, znajdują się w stanie RESUMED . Poprawia to kompatybilność z trybami wielu okien i MD w przypadku aplikacji, które używają onPause() zamiast onStop() w celu zatrzymania odświeżania interfejsu użytkownika i interakcji z użytkownikiem. To znaczy:

  • Obie czynności na podzielonym ekranie zostaną wznowione.
  • Wszystkie widoczne od góry działania w trybie swobodnego okna zostaną wznowione.
  • Czynności na wielu ekranach można wznowić jednocześnie.

Rysunek 1. Wiele CV na urządzeniu składanym

Rysunek 2. Wiele CV w trybie stacjonarnym

Działania mogą znajdować się w stanie PAUSED , gdy nie można się na nich skupić lub są częściowo zasłonięte, na przykład:

  • Na zminimalizowanym podzielonym ekranie (z programem uruchamiającym z boku) główna aktywność nie jest wznawiana, ponieważ nie można na niej ustawić ostrości.
  • W trybie obrazu w obrazie czynność nie jest wznawiana, ponieważ nie można na niej ustawić ostrości.
  • Gdy działania są objęte innymi przezroczystymi działaniami na tym samym stosie.

Takie podejście wskazuje aplikacjom, że działanie może odbierać dane wejściowe od użytkownika tylko w stanie RESUMED . Przed wersją Androida 10 działania mogły być również odbierane w stanie PAUSED (na przykład spróbuj dotknąć obu aktywności jednocześnie na podzielonym ekranie na urządzeniu z Androidem 9).

Aby zachować wznowiony sygnał z poprzednich wersji Androida (oraz informować, kiedy aplikacje powinny uzyskać dostęp do zasobów o wyłącznym dostępie lub zasobów pojedynczych), Android 10 zawiera nowe wywołanie zwrotne:

Activity#onTopResumedActivityChanged(boolean onTop)

Po wywołaniu to wywołanie zwrotne jest wywoływane pomiędzy Activity#onResume() i Activity#onPause() . To wywołanie zwrotne jest opcjonalne i można je pominąć, dzięki czemu czynność może przejść ze RESUMED do stanu PAUSED , nie osiągając najwyższego poziomu w systemie. Na przykład w trybie wielu okien. Ponieważ to wywołanie zwrotne jest opcjonalne, nie jest częścią cyklu życia działania i powinno być rzadko używane.

Poprzednie, najczęściej wznowione działanie odbiera i kończy wykonywanie onTopResumedActivity(false) zanim następne wznowione działanie otrzyma onTopResumedActivity(true) chyba że poprzednie działanie zajmuje zbyt dużo czasu na obsługę wywołania metody i przekroczy limit czasu 500 ms.

Zgodność

Aby zachować kompatybilność podczas wdrażania wielu CV, rozważ poniższe rozwiązania.

Wiele wznowionych działań w jednym procesie aplikacji

  • Wydanie. W systemie Android 9 i niższych w danym momencie wznawiana jest tylko jedna aktywność w systemie. Wszystkie przejścia między czynnościami obejmują wstrzymanie jednej czynności przed wznowieniem innej. Niektóre aplikacje i frameworki (takie jak Flutter lub LocalActivityManager w Androidzie) wykorzystują ten fakt i przechowują stan wznowionej aktywności w singletonach.
  • Rozwiązanie. W systemie Android 9 i starszych wersjach, jeśli zostaną wznowione dwa działania z tego samego procesu, system wznawia tylko działanie o wyższej kolejności Z. Aplikacje przeznaczone dla Androida 10 mogą obsługiwać wiele działań wznawianych w tym samym czasie.

Jednoczesny dostęp do kamery

  • Kwestie . Problemy te występują również w systemie Android 9 i starszych wersjach. Na przykład wznowienie aktywności na pełnym ekranie może spowodować utratę ostrości kamery na rzecz wstrzymanej aktywności na górze w trybie obrazu w obrazie, ale zwiększenie jej ekspozycji w przypadku szerszego zastosowania trybów wielu okien i wielu wyświetlaczy.
    • Ze względu na zmiany stanu RESUME aplikacje mogą zostać odłączone od aparatu nawet po jego wznowieniu . Aby rozwiązać ten problem, aplikacje muszą obsłużyć rozłączenie kamery bez awarii. Po rozłączeniu aplikacje otrzymują wywołanie zwrotne rozłączenia, a wszystkie wywołania interfejsu API zaczynają zgłaszać CameraAccessException .
    • resizeableActivity=false nie gwarantuje wyłącznego dostępu do aparatu, ponieważ inne aplikacje korzystające z aparatu można otwierać na innych wyświetlaczach.
  • Rozwiązania. Programiści powinni uwzględnić logikę dotyczącą odłączania aplikacji od aparatu. Jeśli aplikacja zostanie odłączona od aparatu, powinna obejrzeć wywołania zwrotne dotyczące dostępności aparatu, aby spróbować ponownie się połączyć i kontynuować korzystanie z aparatu. Oprócz istniejącego wywołania zwrotnego CameraManager#AvailabilityCallback#onCameraAvailable() w systemie Android 10 dodano CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , które obejmuje przypadek przełączania fokusu (i priorytetu kamery) między kilkoma wznowionymi czynnościami. Twórcy aplikacji powinni używać obu tych wywołań zwrotnych, aby określić dobry moment na próbę uzyskania dostępu do kamery.

Wiele CV

W systemie Android 10 stan cyklu życia aktywności jest określany na podstawie widoczności i kolejności Z. Aby upewnić się, że po aktualizacji widoczności działania jest prawidłowy stan i ocenić, który stan cyklu życia ma zastosowanie, wywołaj metodę ActivityRecord#makeActiveIfNeeded() z różnych lokalizacji. W systemie Android 10 aktywny oznacza RESUMED lub PAUSED i działa tylko w tych dwóch przypadkach.

W systemie Android 10 wznawianie aktywności jest śledzone osobno w każdym stosie, a nie w jednym miejscu w systemie. Dzieje się tak dlatego, że w trybach wielu okien można jednocześnie wykonać kilka przejść aktywności. Aby uzyskać szczegółowe informacje, zobacz ActivityStack#mInResumeTopActivity .

Najczęściej wznawiane wywołanie zwrotne dotyczące aktywności

Po akcjach, które mogą skutkować zmianą najważniejszej aktywności (takiej jak uruchomienie działania, wznowienie lub zmiana kolejności Z), wywoływana jest funkcja ActivityStackSupervisor#updateTopResumedActivityIfNeeded() . Ta metoda sprawdza, czy najwyższe wznowione działanie uległo zmianie i w razie potrzeby przeprowadza aktualizację. Jeśli poprzednia aktywność o najwyższym wznowieniu nie zwolniła stanu o najwyższym wznowieniu, wysyłany jest do niej komunikat o utracie stanu o najwyższym wznowieniu, a po stronie serwera zaplanowany jest limit czasu ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). Raport o stanie najwyżej wznowionym jest wysyłany do następnego działania po zwolnieniu stanu przez poprzednie lub po przekroczeniu limitu czasu (zobacz zastosowania:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Dodano nowy element transakcji TopResumedActivityChangeItem , aby raportować klientom najczęściej wznawiane zmiany stanu i wykorzystuje architekturę ActivityLifecycler z systemu Android 9.

Stan najwyższego wznowienia jest przechowywany po stronie klienta i za każdym razem, gdy aktywność przechodzi do stanu RESUMED lub PAUSED , sprawdza również, czy należy wywołać wywołanie zwrotne onTopResumedActivityChanged() . Umożliwia to pewne oddzielenie w komunikacji stanów cyklu życia i stanu najwyższego wznowienia pomiędzy stroną serwera i klienta.