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.
- 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.
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)
Zrozumienie cyklu życia działania
The. cykl życia działalności pozostaje niezmieniona w trybie wielu okien: 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ę.
-
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ół.
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żyjMediaSession#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.
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
LubView#DRAG_FLAG_GLOBAL_URI_WRITE
, odpowiednio.
- Nowy pseudonim dla
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
IPackageManager#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śliandroid: windowBackground
jest rozbrojony,android: windowBackgroundFallback
jest używany zamiast tego. Przykładową aplikację można znaleźć w przykładowej aplikacji Multi-Window Playground.
- 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.
- Dokumentacja wielu okien.
- Wytyczne Material Design dla trybu podzielonego ekranu.
- Przykładowa aplikacja obsługująca wiele okien.