Aplikacje na składane i wieloekranowe urządzenia
Ogólnie rzecz biorąc, aplikacje nie powinny opierać się na statycznych identyfikatorach ani funkcjach logicznych uzależnionych od tego, niektóre wyświetlane identyfikatory. W większości przypadków aplikacje powinny zmieniać rozmiar i działać na różnych wyświetlaczach, a system powinien kontrolować ich lokalizację. Na przykład możesz stworzyć nowe, unikalne rozwiązanie dla składanych urządzeń i uruchomić specjalną aplikację na ekranie zewnętrznym, gdy urządzenie jest złożone.
W takim przypadku interfejs SystemUI (lub inny komponent systemu) powinien wykryć określić, czy dane działanie jest odpowiednie, a następnie uruchomić jako aktywność docelową, a jako cel uruchamiania podaj identyfikator wyświetlania zewnętrznego. Aplikacje nie powinny wykrywać tego działania ani wykonywać żadnych działań, a następnie uruchamiają ją na konkretnym wyświetlaczu. Innymi słowy, nie zakładaj, że To, co działa na jednym urządzeniu, będzie działać na innych. Krótko mówiąc, ustawienia zwiększa fragmentację kodu.
Ograniczanie dostępu do wyświetlaczy
Jeśli konfiguracja urządzenia wymaga ograniczenia dostępu do co najmniej jednego
zalecamy użycie flagi Display#FLAG_PRIVATE
oznaczanie takich ekranów jako prywatne. W ten sposób uniemożliwiasz wszystkim oprócz właściciela wyświetlanie treści na wyświetlaczu. Każda próba uruchomienia aktywności lub dodania okna przez osobę inną niż właściciel kończy się wynikiem SecurityException
.
Jeśli system jest właścicielem ekranu, może dodawać okna i uruchamiać działania.
Dodatkowo elementy umieszczone na wyświetlaczu zawsze mają do niego dostęp. Jeśli właściciel uruchomi działanie na wyświetlaczu, może ono uruchomić inne na tym ekranie. W związku z tym właściciel jest odpowiedzialny za ograniczenie dostępu i zezwalania tylko na zaufane aplikacje.
Dodaliśmy też więcej ograniczeń do wyświetlaczy wirtualnych, ponieważ
utwórz je bez wyświetlania ich użytkownikowi. Jeśli wyświetlacz wirtualny nie jest
należące do systemu, to jedynie działania z
allowEmbedded
są dozwolone, a element wywołujący powinien mieć parametr ACTIVITY_EMBEDDING
uprawnienia.
Więcej informacji znajdziesz w tych artykułach:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Aby warunkowo kontrolować uruchamianie aktywności, użyj funkcji LaunchParamsController
,
przechwytuje całą uruchamianą aktywność i pozwala komponentowi systemu modyfikować
parametrów używanych do uruchomienia. Ta funkcja jest dostępna w języku: system_server
.
Skonfiguruj ustawienia okna wyświetlania i dekoracje systemowe
Dekoracje systemu można konfigurować na poszczególnych wyświetlaczach w DisplayWindowSettings
. Urządzenie
może zapewnić domyślną konfigurację
/data/system/display_settings.xml
Ta wartość określa, czy dekoracje systemowe (program uruchamiający, tapeta,
pasek nawigacyjny i okna innych dekoracji) oraz edytor IME pojawią się na wyświetlaczu.
Więcej informacji znajdziesz w artykułach DisplayWindowSettings#shouldShowSystemDecorsLocked()
i DisplayWindowSettings#shouldShowImeLocked()
.
Aby zidentyfikować wyświetlacz, użyj unikalnego identyfikatora (domyślnie używany jest
DisplayInfo#uniqueId
) lub fizyczny identyfikator portu sprzętowego.
(patrz DisplayInfo#address
).
Na przykład ten przykład konfiguracji wyświetlania włącza dekoracje systemowe, IME na symulowanym wyświetlaczu:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
W przykładzie powyżej wartość uniqueId
jest używana do identyfikacji wyświetlania w atrybutach nazwy, który w przypadku symulowanego wyświetlania ma wartość overlay:1
.
W przypadku wbudowanego wyświetlacza przykładowa wartość może wynosić "local:45354385242535243453"
.
Możesz też użyć informacji o porcie sprzętowym i ustawić identifier="1"
aby odpowiadał DisplayWindowSettings#IDENTIFIER_PORT
, a następnie zaktualizuj
nazwa, by użyć formatu "port:<port_id>"
:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Szczegółowe informacje znajdziesz w artykule Identyfikatory statycznych wyświetlaczy.
Więcej informacji znajdziesz w tych artykułach: