Tryb wielu okien w dowolnym formacie to słabo wykorzystywana i niedoceniana funkcja w Androidzie Nougat. Wyjaśniamy, co to jest i jak programiści mogą to włączyć.
Kiedy na początku 2016 roku zaprezentowano po raz pierwszy system Android 7.0 Nougat, wprowadzono na platformę Android bardzo oczekiwaną funkcję — obsługę wielu okien. Większość ludzi wie, że obsługa wielu okien na podzielonym ekranie jest domyślnie włączona na wszystkich telefonach i tabletach z Androidem Nougat. Urządzenia Android TV z systemem Android Nougat obsługują funkcję obrazu w obrazie w wielu oknach.
Jednak w Androidzie Nougat dostępny jest trzeci tryb wielu okien, o którym niewiele osób wie: tryb okna swobodnego. Ten tryb umożliwia systemowi Android prezentowanie aplikacji jako pływających okien, które użytkownik może dowolnie przesuwać i zmieniać ich rozmiar. Zasadniczo jest to implementacja aplikacji na Androida menedżer okien układania.
w Dokumentacja pakietu SDK dla Androida, Twierdzi, że:
Producenci większych urządzeń mogą włączyć tryb dowolny, w którym użytkownik może dowolnie zmieniać rozmiar każdej czynności. Jeśli producent włączy tę funkcję, urządzenie oprócz trybu podzielonego ekranu oferuje tryb dowolny.
A także w CDD z Androidem 7.0:
Implementacje urządzeń z ekranem o rozmiarze xlarge POWINNY obsługiwać tryb dowolny.
Oznacza to, że każde nowe urządzenie z systemem Android z dużym ekranem i systemem Android 7.0 może potencjalnie mieć włączony przez producenta tryb okna o dowolnym kształcie.
Jednak absolutnie nie jest to trudny wymóg. Istnieje możliwość wymuszenia każdy Urządzenie z systemem Android Nougat (z włączonymi opcjami programistycznymi) obsługujące tryb okna o dowolnym kształcie przy użyciu jednej z dwóch różnych metod:
Włączanie trybu okna o dowolnym kształcie na dowolnym urządzeniu z Androidem Nougat
Metoda 1 (wymagany jest komputer z adb)
Upewnij się, że debugowanie USB jest włączone w Opcjach programisty. Następnie podłącz urządzenie do komputera z zainstalowanym adb i wykonaj następujące polecenie:
adb shell settings put global enable_freeform_support 1
Metoda 2 (bez dodatkowych wymagań)
Włącz opcję „Wymuś zmianę rozmiaru działań” u dołu Opcji programisty.
Obie te metody wymagają ponownego uruchomienia interfejsu systemowego, zanim będą mogły zacząć obowiązywać. Najprostszym sposobem, aby to zrobić, jest ponowne uruchomienie urządzenia (lub, jeśli urządzenie jest zrootowane, możesz po prostu zabić plik com.android.systemui
proces)
OK, więc tryb dowolny jest włączony… co teraz?
Jeśli włączyłeś tryb dowolny przy użyciu metody 1, we wpisach aplikacji w menu Przegląd pojawi się nowy przycisk umożliwiający uruchomienie aplikacji w trybie okna swobodnego.
Jednak w przypadku metody 2 nie można uruchomić aplikacji w trybie dowolnym za pośrednictwem samego systemu Android. Na szczęście, dowolny program uruchamiający innej firmy może uruchomić aplikację w trybie okna dowolnego kształtu przy użyciu standardowych interfejsów API systemu Android, które zostały sfinalizowane w ramach poziomu interfejsu API 24.
Kluczem do uruchomienia aplikacji w trybie dowolnym jest wywołanie metody ActivityOptions.setLaunchBounds()
metoda. Ta metoda wymaga a Rect
jako argument zawierający granice okna, z którym aplikacja zostanie uruchomiona.
Następnie możesz uruchomić aplikację za pomocą startActivity(Intent, Bundle)
. Jeśli jeszcze nie masz ActivityOptions
pakiet, możesz go utworzyć za pomocą ActivityOptions.makeBasic()
i potem dzwonię setLaunchBounds()
na świeżo utworzonym pakiecie.
Należy pamiętać, że domyślnie, jeśli na ekranie Przegląd znajduje się już zadanie dla aplikacji Android po prostu przekieruje Cię do istniejącego (pełnoekranowego) zadania, które zostało wcześniej uruchomione przez użytkownik. Przed próbą uruchomienia aplikacji w dowolnym oknie należy wyczyścić wszystkie zadania aplikacji w Przeglądzie. (W przypadku aplikacji z działaniami uruchamianymi w standard
Lub singleTop
trybach, możesz wymusić otwarcie nowego okna, dodając Intent.FLAG_ACTIVITY_MULTIPLE_TASK
flagę zgodnie z intencją przed wywołaniem startActivity()
.)
Jak tryb dowolny działa pod maską?
Jest świetny artykuł napisano wyjaśniający, w jaki sposób tryb wielu okien, w tym tryb dowolny, jest zaimplementowany w systemie Android Nougat. (UWAGA: artykuł jest napisany w języku chińskim, dlatego pamiętaj o przepuszczeniu go przez Tłumacz Google)
Krótko mówiąc, aplikacje w trybie dowolnym działają na osobnym stosie od reszty systemu (pomyśl: wirtualny pulpit). Dlatego nie jest możliwe, aby aplikacje w dowolnym formacie działały w programie uruchamiającym lub w innej aplikacji pełnoekranowej.
Aplikacje działające w trybie dowolnym (które nie mają android: windowIsFloating
ustawione na true) mają a DecorCaptionView
dodany jako element podrzędny najwyższego poziomu DecorView
. Widok ten zawiera LinearLayout
definiowanie paska podpisu okna umożliwiającego przesuwanie, maksymalizację i zamykanie okna. Chociaż nie polecam tego osobiście, można uzyskać dostęp do tego widoku i dostosować go, pobierając DecorView
za pomocą Window.getDecorView()
, rzucając go na a ViewGroup
a następnie uzyskując dostęp do widoków podrzędnych.
Każda aplikacja zaprojektowana tak, aby dobrze działała w standardowym trybie wielu okien z podzielonym ekranem w systemie Android, będzie działać w trybie dowolnym. isInMultiWindowMode()
zwróci wartość true dla aplikacji działających w trybie dowolnym. Istnieje kilka innych publicznie dostępnych klas i metod, których może używać aplikacja, a które odnoszą się konkretnie do trybu swobodnego:
-
Window.setDecorCaptionShade()
: tej metody można użyć do zastąpienia odcienia elementów sterujących napisami (przycisku maksymalizacji i zamykania) w aplikacjach w trybie dowolnym. -
Window.setRestrictedCaptionAreaListener()
: można tego użyć do wykrycia ruchu okna w trybie dowolnym. TheWindow.OnRectrictedCaptionAreaChangedListener
jest wywoływana za każdym razem, gdy zmienia się pozycja kontrolek napisów (kiedy użytkownik przesuwa okno) i udostępnia funkcję aRect
z nowymi granicami elementów sterujących napisami. -
ActivityInfo.WindowLayout
: ta klasa zawiera informacje zadeklarowane w manifeście aplikacji dotyczące początkowego położenia okna o dowolnym kształcie, o które aplikacja może poprosić po uruchomieniu. Na przykład możesz wymienić następujące elementy w pliku tag Twojego manifestu:
Następnie, gdy urządzenie będzie już w trybie swobodnym i aplikacja zostanie uruchomiona, zostanie ona uruchomiona z określonymi granicami.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Przykłady trybu okna swobodnego w akcji
Latem 2016 roku, gdy Android Nougat był jeszcze w fazie deweloperskiej, wydałem aplikację o nazwie pasek zadań który zapewnia menu startowe podobne do systemu Windows i listę ostatnich aplikacji w nakładce systemowej. Umożliwia użytkownikom Nougata uruchamianie aplikacji w trybie okna o dowolnym kształcie — a ponieważ pasek zadań korzysta z nakładki, może pozostać na ekranie w środowisku okna o dowolnym kształcie. Połączenie paska zadań i trybu swobodnego sprawia, że każde urządzenie z systemem Android, a zwłaszcza tablety, wygląda jak komputer PC.
Możesz pobierz pasek zadań w Google Play lub zobacz kod źródłowy siebie na GitHubie. Oprócz koncepcji wspomnianych w tym artykule stosuję także kilka sztuczek, aby środowisko trybu swobodnego było aktywne nawet wtedy, gdy na ekranie nie są wyświetlane żadne okna o dowolnym kształcie. Użytkownicy mogą także opcjonalnie ustawić pasek zadań jako domyślny program uruchamiający, aby umożliwić automatyczne uruchamianie urządzenia w środowisku w trybie dowolnym.
Ponieważ nie ma urządzeń oficjalnie dostarczanych z obsługą okien dowolnych włączoną przez producenta OEM (w chwili pisania tego tekstu), polecam używanie paska zadań jako narzędzia dla programistów do testowania aplikacji w środowisku dowolnego okna na urządzeniach, które w inny sposób nie obsługują To.
Oprócz paska zadań zmodyfikowałem także kod źródłowy Launchera3 z AOSP, aby umożliwić mu uruchamianie aplikacji w trybie dowolnym. Jest to prosty klon standardowego programu uruchamiającego Androida 7.1.1, z minimalnymi modyfikacjami niezbędnymi do uruchamiania dowolnych aplikacji. Udostępniłem ten zmodyfikowany program uruchamiający w nadziei, że inni programiści wdrożą obsługę uruchamiania okien o dowolnym kształcie w swoich niestandardowych programach uruchamiających. Możesz zobacz kod źródłowy na GitHubie lub pobierz przykładowy plik APK.
Mam nadzieję, że twórcy niestandardowych programów uruchamiających będą mogli wykorzystać ten kod i włączyć obsługę uruchamiania w formacie dowolnym aplikacje okienkowe dla użytkowników, którzy pragną większej elastyczności w zarządzaniu oknami na dużych ekranach urządzenia.