Aplikacje na urządzenia składane i z wieloma ekranami
Aplikacje nie powinny polegać na statycznych identyfikatorach ani na logice, która zależy od niektórych identyfikatorów wyświetlania. W większości przypadków aplikacje powinny zmieniać rozmiar i działać na różnych wyświetlaczach, a system powinien kontrolować, gdzie je znaleźć. 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 SystemUI (lub inny komponent systemu) powinien wykryć złożenie, określić, czy wykonanie działania jest właściwe, a następnie uruchomić aktywność docelową i jako docelowe urządzenie wyświetlania podać identyfikator zewnętrznego wyświetlacza. Aplikacje nie powinny wykrywać tego działania ani wykonywać żadnych działań i uruchamiać aplikacji na określonym wyświetlaczu. Nie zakładaj, że to, co działa na jednym urządzeniu, będzie działać na innych. Krótko mówiąc, kod dostosowany do urządzenia zwiększa fragmentację.
Ograniczanie dostępu do wyświetlaczy
Jeśli konfiguracja urządzenia wymaga ograniczenia dostępu do co najmniej jednego wyświetlacza, zalecamy użycie flagi Display#FLAG_PRIVATE
do oznaczenia takich wyświetlaczy jako prywatnych. W ten sposób uniemożliwiasz wszystkim oprócz właściciela wyświetlanie treści na ekranie. Każda próba uruchomienia działania lub dodania okna przez dowolną osobę oprócz właściciela skutkuje wyświetleniem 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 na wyświetlaczu jakieś działanie, może ono uruchamiać na nim inne działania. W związku z tym właściciel jest odpowiedzialny za ograniczanie dostępu i zezwalanie na dostęp tylko zaufanym aplikacjom.
Oprócz tego wprowadzamy więcej ograniczeń w przypadku wyświetlaczy wirtualnych, ponieważ każda aplikacja może utworzyć taki panel bez udostępniania go użytkownikowi. Jeśli wyświetlacz wirtualny nie jest własnością systemu, dozwolone są tylko aktywności z allowEmbedded
, a wywołujący powinien mieć uprawnienia ACTIVITY_EMBEDDING
.
Więcej informacji znajdziesz w tych artykułach:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Aby warunkowo kontrolować uruchamianie aktywności, użyj metody LaunchParamsController
, która przechwytuje wszystkie uruchamianie aktywności i umożliwia komponentowi systemu modyfikowanie parametrów używanych do uruchomienia. Jest ona dostępna w języku system_server
.
Konfigurowanie ustawień okna wyświetlania i ozdobników systemu
Dekoracje systemu można konfigurować na poszczególnych wyświetlaczach w DisplayWindowSettings
. Implementacja urządzenia może udostępnić domyślną konfigurację w /data/system/display_settings.xml
.
Ta wartość określa, czy dekoracje systemowe (program uruchamiający, tapeta, pasek nawigacyjny i inne okna dekoracyjne) oraz edytor IME mają być wyświetlane 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 DisplayInfo#uniqueId
) lub identyfikatora portu fizycznego dla wyświetlaczy sprzętu (patrz DisplayInfo#address
).
Na przykład ten przykład konfiguracji wyświetlania włącza dekoracje systemowe i 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"
tak, by odpowiadał DisplayWindowSettings#IDENTIFIER_PORT
, a następnie zaktualizować nazwę do 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>
Więcej informacji znajdziesz w artykule Statyczne identyfikatory wyświetlania.
Więcej informacji znajdziesz w tych artykułach: