Wielokrotne wznowienie

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

  • Nowa, półprzezroczysta aktywność została uruchomiona na wierzchu aplikacji, gdy była ona nadal widoczna (a więc nie została zatrzymana).
  • Aktywność straciła fokus, ale nie była zasłonięta i użytkownik mógł z nią wchodzić w interakcję. Na przykład w trybie wielu okien jednocześnie może być widocznych kilka aktywności, które mogą odbierać dane wejściowe dotykiem.

Te sytuacje różnią się stopniem wstrzymania aplikacji, ale nie można ich rozróżnić na poziomie aplikacji.

W Androidzie 10 wszystkie działania, na których można się skupić w widocznych stosach, znajdują się w stanie RESUMED. Poprawia to zgodność z wieloma oknami i trybami MD w przypadku aplikacji, które do zatrzymywania odświeżania interfejsu i interakcji z użytkownikiem używają onPause() zamiast onStop(). Oznacza to, że:

  • Obie aktywności w trybie podzielonego ekranu zostaną wznowione.
  • Wszystkie widoczne aktywności w trybie okien o dowolnym kształcie zostaną wznowione.
  • Aktywności na wielu ekranach można wznawiać jednocześnie.

Rysunek 1. Wielokrotne wznawianie na urządzeniu składanym

Rysunek 2. Wielokrotne wznawianie w trybie pulpitu

Aktywności mogą być w stanie PAUSED, gdy nie można ich zaznaczyć lub są częściowo zasłonięte, np.:

  • W zminimalizowanym widoku podzielonego ekranu (z launcherem z boku) aktywność na górze nie jest wznawiana, ponieważ nie można jej ustawić jako aktywnej.
  • W trybie obrazu w obrazie aktywność nie jest wznawiana, ponieważ nie można jej ustawić jako aktywnej.
  • Gdy aktywności są objęte innymi przejrzystymi aktywnościami w tym samym stosie.

Informuje to aplikacje, że aktywność może otrzymywać dane wejściowe od użytkownika tylko w stanie RESUMED. Przed Androidem 10 aktywności mogły też odbierać dane wejściowe w stanie PAUSED (np. spróbuj dotknąć jednocześnie obu aktywności w trybie podzielonego ekranu na urządzeniu z Androidem 9).

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

Activity#onTopResumedActivityChanged(boolean onTop)

Po wywołaniu to wywołanie zwrotne jest wywoływane między Activity#onResume()Activity#onPause(). Ten wywołanie zwrotne jest opcjonalne i można je pominąć, więc aktywność może przejść ze stanu RESUMED do stanu PAUSED bez stania się aktywnością na wierzchu w systemie. na przykład w trybie wielu okien. Ten wywołanie zwrotne jest opcjonalne, więc nie jest częścią cyklu życia aktywności i powinno być rzadko używane.

Poprzednia aktywność na pierwszym planie otrzymuje i kończy wykonywanie funkcji onTopResumedActivity(false), zanim następna aktywność na pierwszym planie otrzyma funkcję onTopResumedActivity(true), chyba że poprzednia aktywność potrzebuje zbyt dużo czasu na obsługę wywołania metody i osiągnie limit czasu 500 ms.

Zgodność

Aby zachować zgodność podczas wdrażania funkcji wznawiania wielu zadań, rozważ te rozwiązania.

Wiele wznowionych aktywności w jednym procesie aplikacji

  • Problem. W Androidzie 9 i starszych wersjach w danym momencie wznawiana jest tylko jedna aktywność w systemie. Wszystkie przejścia między aktywnościami wiążą się z wstrzymaniem jednej aktywności przed wznowieniem innej. Niektóre aplikacje i platformy (np. Flutter czy LocalActivityManager w Androidzie) wykorzystują ten fakt i przechowują stan wznowionej aktywności w singletonach.
  • Rozwiązanie. W Androidzie 9 i starszych wersjach, jeśli dwa działania z tego samego procesu zostaną wznowione, system wznowi tylko to działanie, które ma wyższą pozycję w kolejności Z. Aplikacje na Androida 10 mogą obsługiwać jednoczesne wznawianie wielu aktywności.

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 i wznowiona może utracić ostrość aparatu na rzecz wstrzymanej aktywności na wierzchu w trybie obrazu w obrazie, ale może być bardziej narażona na utratę ostrości w przypadku szerszego zastosowania trybów wielu okien i wielu wyświetlaczy.
    • Ze względu na zmiany wprowadzone w RESUME stanie aplikacje mogą zostać odłączone od kamery nawet po wznowieniu. Aby temu zapobiec, aplikacje muszą obsługiwać odłączenie kamery bez awarii. Po odłączeniu aplikacje otrzymują wywołanie zwrotne informujące o odłączeniu, a wszystkie wywołania interfejsu API zaczynają zgłaszać błąd CameraAccessException.
    • resizeableActivity=false nie gwarantuje wyłącznego dostępu do aparatu, ponieważ inne aplikacje korzystające z aparatu można otworzyć na innych wyświetlaczach.
  • Rozwiązania Deweloperzy powinni uwzględnić logikę działania aplikacji w przypadku odłączenia od kamery. Jeśli aplikacja zostanie odłączona od kamery, powinna nasłuchiwać wywołań zwrotnych dotyczących dostępności kamery, aby spróbować ponownie się połączyć i dalej korzystać z kamery. Oprócz istniejącego wywołania zwrotnego CameraManager#AvailabilityCallback#onCameraAvailable() w Androidzie 10 dodano wywołanie CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged(), które obejmuje przypadek, gdy ostrość (i priorytet aparatu) przełącza się między kilkoma wznowionymi aktywnościami. Deweloperzy aplikacji powinni używać obu tych wywołań zwrotnych, aby określić odpowiedni moment na próbę uzyskania dostępu do aparatu.

Wznów wielokrotny

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

W Androidzie 10 wznawianie aktywności jest śledzone osobno w każdym stosie, a nie w jednym miejscu w systemie. Wynika to z faktu, że w trybach wielu okien można wykonywać kilka przejść aktywności jednocześnie. Więcej informacji znajdziesz w sekcji ActivityStack#mInResumeTopActivity.

Wywołanie zwrotne dotyczące wznowienia działania na pierwszym planie

Po działaniach, które mogą spowodować zmianę najważniejszej aktywności (np. uruchomienie, wznowienie lub zmiana kolejności Z), wywoływana jest funkcja ActivityStackSupervisor#updateTopResumedActivityIfNeeded(). Ta metoda sprawdza, czy zmieniła się aktywność na samej górze, która została wznowiona, i w razie potrzeby przeprowadza aktualizację. Jeśli poprzednia aktywność, która była na pierwszym planie, nie zwolniła stanu „na pierwszym planie”, wysyłana jest do niej wiadomość o utracie stanu „na pierwszym planie”, a po stronie serwera planowany jest limit czasu (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). Raport o stanie „na pierwszym planie” jest wysyłany do następnej aktywności po tym, jak poprzednia zwolni stan, lub po upłynięciu limitu czasu (patrz użycie:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Dodano nowy element transakcji TopResumedActivityChangeItem, aby raportować klientom zmiany stanu wznawiania i korzystać z architektury ActivityLifecycler z Androida 9.

Stan wznowienia jest przechowywany po stronie klienta. Za każdym razem, gdy aktywność przechodzi do stanu RESUMED lub PAUSED, sprawdza się też, czy należy wywołać wywołanie zwrotne onTopResumedActivityChanged(). Umożliwia to pewne rozdzielenie komunikacji stanów cyklu życia i stanu najwyższego wznowienia między serwerem a klientem.