Wielokrotne wznowienie

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

  • Nad aplikacją uruchomiono nowe, półprzezroczyste działanie, gdy aplikacja była nadal widoczna (a więc nie została zatrzymana).
  • Działanie utraciło fokus, ale nie było zasłonięte i użytkownik mógł z niego korzystać. Na przykład w trybie wielu okien kilka działań może być widocznych i jednocześnie odbierać dane wejściowe.

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

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

  • oba działania w trybie podzielonego ekranu są wznawiane;
  • wszystkie widoczne działania w trybie okien o dowolnych rozmiarach są wznawiane;
  • działania na wielu ekranach można wznawiać jednocześnie.

Rysunek 1. Jednoczesne wznowienie na urządzeniu składanym

Rysunek 2. Wznawianie wielu działań w trybie pulpitu

Działania mogą znajdować się w stanie PAUSED, gdy nie można ich ustawić jako aktywnych lub gdy są częściowo zasłonięte, np.:

  • W zminimalizowanym trybie podzielonego ekranu (z launcherem z boku) działanie na górze nie jest wznawiane, ponieważ nie można go ustawić jako aktywnego.
  • W trybie obrazu w obrazie działanie nie jest wznawiane, ponieważ nie można go ustawić jako aktywnego.
  • Gdy działania są zasłonięte przez inne przezroczyste działania w tym samym stosie.

To podejście informuje aplikacje, że działanie może odbierać dane wejściowe od użytkownika tylko w stanie RESUMED. Przed Androidem 10 działania mogły też odbierać dane wejściowe w stanie PAUSED (na przykład spróbuj jednocześnie dotknąć obu działań 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() a Activity#onPause(). To wywołanie zwrotne jest opcjonalne i można je pominąć, dzięki czemu działanie może przejść ze stanu RESUMED do stanu PAUSED bez stania się najwyższym 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 działanie na górze, które zostało wznowione, odbiera i kończy wykonanie onTopResumedActivity(false), zanim następne działanie na górze, które zostało wznowione, otrzyma onTopResumedActivity(true), chyba że poprzednie działanie zajmie zbyt dużo czasu na obsługę wywołania metody i osiągnie limit czasu 500 ms.

Zgodność

Aby zachować zgodność podczas implementowania jednoczesnego wznowienia, rozważ te rozwiązania.

Wiele wznowionych działań w jednym procesie aplikacji

  • Problem. W Androidzie 9 i starszych wersjach w danym momencie wznawiane jest tylko jedno działanie w systemie. Wszystkie przejścia między działaniami obejmują wstrzymanie jednego działania przed wznowieniem innego. Niektóre aplikacje i platformy (np. Flutter czy LocalActivityManager w Androidzie) wykorzystują ten fakt i przechowują stan wznowionego działania w singletonach.
  • Rozwiązanie. W Androidzie 9 i starszych wersjach, jeśli 2 działania z tego samego procesu są wznawiane, system wznawia tylko działanie, które znajduje się wyżej w kolejności Z. Aplikacje kierowane na Androida 10 mogą obsługiwać wznawianie wielu działań jednocześnie.

Jednoczesny dostęp do aparatu

  • Problemy. Te problemy występują też w Androidzie 9 i starszych wersjach. Na przykład działanie na pełnym ekranie, które zostało wznowione, może utracić fokus aparatu na rzecz wstrzymanego działania na górze w trybie obrazu w obrazie, ale może być bardziej narażone na utratę fokusu w przypadku szerszego przyjęcia trybów wielu okien i wielu ekranów.
    • Ze względu na zmiany wprowadzone w stanie RESUME aplikacje mogą zostać odłączone od aparatu nawet po wznowieniu. Aby temu zapobiec, aplikacje muszą obsługiwać odłączenie aparatu bez awarii. Po odłączeniu aplikacje otrzymują wywołanie zwrotne informujące o odłączeniu, a wszystkie wywołania interfejsu API zaczynają zgłaszać wyjątek CameraAccessException.
    • resizeableActivity=false nie gwarantuje wyłącznego dostępu do aparatu, ponieważ inne aplikacje korzystające z aparatu można otworzyć na innych ekranach.
  • Rozwiązania. Deweloperzy powinni uwzględnić logikę na wypadek odłączenia aplikacji od aparatu. Jeśli aplikacja zostanie odłączona od aparatu, powinna nasłuchiwać wywołań zwrotnych dotyczących dostępności aparatu, aby spróbować ponownie się połączyć i kontynuować korzystanie z aparatu. Oprócz dotychczasowego wywołania zwrotnego CameraManager#AvailabilityCallback#onCameraAvailable() w Androidzie 10 dodano CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged(), które obejmuje przypadek, gdy fokus (i priorytet aparatu) przełącza się między kilkoma wznowionymi działaniami. Deweloperzy aplikacji powinni używać obu tych wywołań zwrotnych, aby określić odpowiedni moment na próbę uzyskania dostępu do aparatu.

Jednoczesne wznowienie

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

W Androidzie 10 wznawianie działania jest śledzone oddzielnie w każdym stosie, a nie w jednej lokalizacji w systemie. Dzieje się tak, ponieważ w trybach wielu okien można wykonywać kilka przejść między działaniami jednocześnie. Więcej informacji znajdziesz w artykule ActivityStack#mInResumeTopActivity.

Wywołanie zwrotne dotyczące działania na górze, które zostało wznowione

Po działaniach, które mogą spowodować zmianę działania na górze (np. uruchomienie działania, wznowienie lub zmiana kolejności Z), wywoływana jest metoda ActivityStackSupervisor#updateTopResumedActivityIfNeeded(). Ta metoda sprawdza, czy zmieniło się działanie na górze, które zostało wznowione, i w razie potrzeby aktualizuje je. Jeśli poprzednie działanie na górze, które zostało wznowione, nie zwolniło stanu działania na górze, które zostało wznowione, zostanie do niego wysłana wiadomość o utracie stanu działania na górze, które zostało wznowione, a po stronie serwera zostanie zaplanowany limit czasu (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). Raport o stanie działania na górze, które zostało wznowione, jest wysyłany do następnego działania po tym, jak poprzednie działanie zwolni stan, lub po upływie limitu czasu (zobacz użycie:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Dodano nowy element transakcji TopResumedActivityChangeItem, aby zgłaszać klientom zmiany stanu działania na górze, które zostało wznowione, i wykorzystuje on architekturę ActivityLifecycler z Androida 9.

Stan działania na górze, które zostało wznowione, jest przechowywany po stronie klienta, a za każdym razem, gdy działanie przechodzi do stanu RESUMED lub PAUSED, sprawdza też, czy należy wywołać wywołanie zwrotne onTopResumedActivityChanged(). Umożliwia to pewne rozdzielenie komunikacji stanów cyklu życia i stanu działania na górze, które zostało wznowione, między serwerem a klientem.