Obsługa wielu okien w systemie Android N: co programiści muszą wiedzieć, aby w pełni wykorzystać możliwości

Przedstawiamy przegląd tego, co nadchodząca obsługa wielu okien w systemie Android N oznacza dla programistów i jak najlepiej ją wykorzystać!

Obsługa wielu okien to ciekawa funkcja, na którą czekamy w Androidzie N taki, o którym od dawna marzyliśmy, aby był dostępny na wszystkich urządzeniach. Jednak aby było to przyjemne doświadczenie, programiści mogą być zmuszeni wprowadzić pewne zmiany w swoich aplikacjach, aby poprawnie je obsługiwały.

Podczas jednej z sesji Google I/O programiści mogli poznać nowe interfejsy API i zmiany w zachowaniu systemu, jakie niesie ze sobą obsługa wielu okien.

Sesję poprowadził Wale Ogunwale, główny menedżer techniczny Android ActivityManager i Komponenty frameworku WindowManager – on i jego zespół są odpowiedzialni za multi-window na Androidzie.

Możesz obejrzeć Sesja w trybie wielu okien na YouTube, ale tutaj zamieszczamy również przegląd sesji.

N wprowadza trzy różne tryby wielu okien:
  • Tryb podzielonego ekranu: jest to tryb dostępny domyślnie. Jak sama nazwa wskazuje, umożliwia otwarcie dwóch aplikacji obok siebie.
  • Tryb dowolny: producenci mogą włączyć tę opcję na większych urządzeniach, co pozwala użytkownikom na swobodną zmianę rozmiaru działań oprócz trybu podzielonego ekranu.
  • Tryb obrazu w obrazie: przeznaczony dla urządzeń z systemem Android TV. Ten tryb jest przeznaczony do odtwarzania wideo w przypiętym oknie, podczas gdy użytkownik wchodzi w interakcję z innymi aplikacjami.
Tryb podzielonego ekranu w systemie Android NTryb Androida N PiP
Warto to zauważyć. omawialiśmy już wcześniej wiele okien w N i przedstawiliśmy krytykę obecnego systemu. Mając to na uwadze, mamy nadzieję, że tryb dowolny zbliży się nieco do trybu obrazu w obrazie, ponieważ miałby przydatne aplikacje na wszystkich urządzeniach.
Włączenie obsługi wielu okien w aplikacjach jest proste: nie musisz nic robić, jeśli już kierujesz reklamy na N. Jeśli zdecydujesz się wyłączyć obsługę wielu okien, możesz to zrobić, ustawiając. android: resizeableActivity atrybut aktywności w manifeście do. false. Należy to robić tylko wtedy, gdy jest to naprawdę uzasadnione, ponieważ zawsze sprawia to, że Twoja aplikacja wyróżnia się w złym świetle uruchamianie w trybie pełnoekranowym, nawet jeśli użytkownik (lub inna aplikacja) spróbuje uruchomić go w wielu oknach tryb. Należy pamiętać, że atrybuty działania głównego mają zastosowanie do wszystkich działań w obrębie jego stosu zadań. Innymi słowy, jeśli masz aktywność, którą mogą rozpocząć inne aplikacje, upewnij się, że obsługuje ona tryb wielu okien ponieważ nie możesz zagwarantować, że inne aplikacje uruchomią Twoją aktywność w nowym zadaniu. Intent#FLAG_ACTIVITY_NEW_TASK Obsługa trybu obrazu w obrazie musi zostać zadeklarowana jawnie poprzez. android: supportsPictureInPicture atrybut. Należy pamiętać, że ten atrybut jest ignorowany if. android: resizeableActivity Jest. false Atrybuty .Layout mogą służyć do ustawiania domyślnych wymiarów i rozmieszczenia okien o dowolnym kształcie lub do określenia minimalnej szerokości lub wysokości zarówno w trybie swobodnego, jak i podzielonego ekranu:
  • android: defaultWidth/android: defaultHeight: domyślne wymiary działania (tryb dowolny).
  • android: gravity: początkowa pozycja działania (tryb dowolny).
  • android: minimalWidth/android: minimalHeight: minimalne wymiary aktywności (tryb dowolny i tryb podzielonego ekranu)
Przykładowy kod znajdziesz w. Przykładowa aplikacja Google Playground z wieloma oknami na GitHubie: AndroidManifest.xml.
Wraz z wprowadzeniem obsługi wielu okien może być konieczne ponowne sprawdzenie kilku rzeczy w aplikacjach, aby upewnić się, że działają poprawnie.

Zrozumienie cyklu życia działania

The. cykl życia działalności pozostaje niezmieniona w trybie wielu okien: Podstawowy cykl życia aktywności w systemie Android Biorąc to pod uwagę, pewne subtelne różnice między stanami aktywności mogą skutkować niezamierzonym zachowaniem, którego normalnie nie zauważyłbyś przed N. Ważne jest, aby to wiedzieć. Activity#onResume() I. Activity#onPause() są wywoływane, gdy aplikacja zyskuje lub traci ostrość, ale niekoniecznie wtedy, gdy zaczyna lub przestaje być widoczna. (Pamiętaj, że w danym momencie aktywna może być tylko jedna aplikacja.) W przypadku aplikacji, które stale aktualizują zawartość (np. odtwarzanie wideo), pamiętaj o obsłudze uruchamiania i zatrzymywania aktualizacji zawartości. Activity#onStart() I. Activity#onStop() Zamiast. Nie robi się tego na przykład w przypadku aplikacji wideo będzie oznaczać, że odtwarzanie będzie możliwe tylko wtedy, gdy aplikacja będzie aktywna, co jest sprzeczne z celem trybu wielu okien. Oficjalna aplikacja YouTube miała podobny problem po pierwszym uruchomieniu Androida N Developer Preview.

Obsługa zmian w czasie wykonywania

Po przełączeniu aplikacji w tryb wielu okien niektóre konfiguracje urządzeń ulegną zmianie. Możesz zezwolić na ponowne uruchomienie aktywności (w takim przypadku. zachowując fragmenty może być dobrym pomysłem, jeśli Twoja aktywność musi wykonywać intensywną operację podczas uruchamiania) lub wybierz. obsłuż zmiany konfiguracji w sposób jawny Zamiast. Cztery konfiguracje urządzeń mogą ulec zmianie po wejściu w tryb wielu okien lub w nim: screenSize, smallestScreenSize, screenLayout I. orientation. Patrz. Dokumentacja dla programistów Androida aby uzyskać więcej informacji na temat każdego atrybutu, ale pamiętaj o tym. orientation w tym przypadku nie odnosi się już do orientacji urządzenia. Zamiast tego wskazuje jedynie, czy szerokość Twojej aktywności jest większa niż jej wysokość (poziom) lub nie (portret). Deklarację, że Twoja aktywność będzie obsługiwać te zmiany można dokonać z poziomu manifestu:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Pamiętaj, że oznacza to, że faktycznie będziesz musiał poradzić sobie z tymi zmianami. Activity#onConfigurationChanged(), ręcznie aktualizując widoki lub ponownie ładując niektóre zasoby.

Wyłączone funkcje w trybie wielu okien

Twoje działania w trybie wielu okien nie będą miały wpływu na niektóre funkcje systemu:
  • Zmiany na pasku stanu i pasku nawigacji, takie jak przyciemnianie/ukrywanie pasków systemowych lub używanie trybu immersyjnego, nie będą miały żadnego wpływu. Ma to sens, ponieważ Twoja aktywność zajmuje tylko część ekranu.
  • The android: screenOrientation atrybut aktywności nie ma również żadnego wpływu w trybie wielu okien: ponieważ rozmiar Twojej aktywności będzie można zmieniać, nie ma już sensu, aby miała stałą orientację.
Dodano nowe wywołania zwrotne dla zdarzeń obejmujących wiele okien, a także metody sprawdzania bieżącego stanu.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): wywoływane, gdy stan aktywności zmienia się z pełnego ekranu na wiele okien i odwrotnie.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): wywoływane, gdy stan aktywności zmienia się na/z trybu PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): zwraca informację, czy aktywność jest w trybie wielu okien/obrazu w obrazie, czy nie.
  • Activity#overlayWithDecorCaption(boolean overlay): w przypadku okien o dowolnym kształcie tej metody można użyć, aby napis (pasek używany do przeciągania okna) nakładał się na zawartość, zamiast ją przesuwać w dół.
PS. Z wyjątkiem. Activity#overlayWithDecorCaption(), metody te są również dostarczane przez. Fragment klasa.

Rozpoczynanie działań w trybie wielu okien

  • Activity#enterPictureInPictureMode() można użyć do przełączenia działania w tryb obrazu w obrazie. Pamiętaj, że działania w trybie PiP nie są powiadamiane o zdarzeniach wejściowych — użyj MediaSession#setMediaButtonReceiver() jeśli chcesz obsłużyć takie zdarzenia. Jeśli jesteś zainteresowany, sprawdź także witrynę programistów Androida Obraz w obrazie na Androidzie N.
  • Jeśli urządzenie znajduje się w trybie podzielonego ekranu, możesz nakazać systemowi uruchomienie innej aktywności obok Twojej, korzystając z przycisku Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT flaga. Flaga nie działa, jeśli nie jest w trybie podzielonego ekranu.
  • Jeśli urządzenie znajduje się w trybie swobodnym, ActivityOptions#setLaunchBounds() można użyć do określenia wymiarów i lokalizacji nowej aktywności na ekranie.
Przykłady kodu można znaleźć w przykładowej aplikacji Multi-Window Playground: przykład działania sąsiadującego, uruchom przykład granic.

Przeciągnij i upuść

Chociaż obsługa przeciągania i upuszczania istnieje już od czasów Honeycomb, wcześniej była możliwa tylko w ramach tej samej czynności. Śnieży. obsługiwane w wielu oknach również. Wydaje się, że wdrożenie tego jest możliwe. przeważnie tak samo jak wcześniej, z kilkoma dodatkami dotyczącymi przeciągania i upuszczania między różnymi aktywnościami:
  • View#startDragAndDrop()
    • Nowy pseudonim dla View#startDrag().
    • Aby włączyć przeciąganie i upuszczanie między działaniami, przekaż nową flagę View#DRAG_FLAG_GLOBAL.
    • Jeśli chcesz nadać uprawnienia URI działaniu odbiorcy, przekaż nowe flagi View#DRAG_FLAG_GLOBAL_URI_READ Lub View#DRAG_FLAG_GLOBAL_URI_WRITE, odpowiednio.
  • View#updateDragShadow()
    • Zastępuje cień przeciągania dla aktualnie trwającej operacji przeciągania. Może zostać wywołana tylko przez aplikację, która zainicjowała operację przeciągania.
  • View#cancelDragAndDrop()
    • Anuluje aktualnie trwającą operację przeciągania. Może zostać wywołana tylko przez aplikację, która zainicjowała operację przeciągania.
  • Sprawdzenie, czy urządzenie obsługuje tryby swobodne lub obraz w obrazie, jest możliwe za pośrednictwem PackageManager#hasSystemFeature(), za pomocą PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT I PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE odpowiednio.
  • The android: windowBackground atrybut może być użyty jako tło do rysowania, jeśli zmieniany jest rozmiar działania i jego renderowanie jest opóźnione. Jeśli android: windowBackground jest rozbrojony, android: windowBackgroundFallback jest używany zamiast tego. Przykładową aplikację można znaleźć w przykładowej aplikacji Multi-Window Playground.
Wale zaproponował kilka najlepszych praktyk, aby zapewnić użytkownikom jak najlepsze doświadczenia:
  • Tryb obsługi zmienia się elegancko:
    • Zachowaj spójność interfejsu użytkownika niezależnie od orientacji. Nie zmieniaj pozycji elementów, aby umożliwić płynne przejścia.
    • Rozwijając powyższe, nie przełączaj się między bardzo różnymi układami w przypadku układów telefonu/tabletu. Zamiast tego dostosuj układ tabletu do mniejszych rozmiarów, aby zachować spójność.
  • Upewnij się, że Twoje działania są dostosowane do małych rozmiarów przez zgodnie ze wzorcami Material Design.
  • Używać FLAG_ACTIVITY_LAUNCH_ADJACENT kiedy ma sens zapewnienie przyjemniejszego doświadczenia w trybie podzielonego ekranu.
  • Deklaruj niezgodność zmiany rozmiaru tylko wtedy, gdy jest to uzasadnione. Jak omówiliśmy powyżej, w przeciwnym razie Twoja aplikacja będzie się wyróżniać w zły sposób.
Wale zakończył sesję, oferując kilka dodatkowych przydatnych zasobów:
  • Dokumentacja wielu okien.
  • Wytyczne Material Design dla trybu podzielonego ekranu.
  • Przykładowa aplikacja obsługująca wiele okien.