Aplikacje na składane i wieloekranowe urządzenia
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ć 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 tym przypadku SystemUI (lub inny komponent systemu) powinien wykryć złożenie, określić, czy wykonanie działania jest odpowiednie, 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ć żadnego działania w odpowiedzi na nie, a następnie uruchamiać się na określonym wyświetlaczu. Innymi słowy, nie zakładaj, że to, co działa na jednym urządzeniu, będzie działać na innych urządzeniach. Krótko mówiąc, kod dla konkretnego urządzenia zwiększa fragmentaryzację.
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
, aby oznaczyć takie wyświetlacze jako prywatne. W ten sposób uniemożliwiasz wszystkim oprócz właściciela wyświetlanie treści na ekranie. 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 wyświetlacza, może dodawać okna i uruchamiać działania.
Ponadto elementy umieszczone na wyświetlaczu mogą zawsze uzyskać do niego dostęp. Jeśli właściciel uruchomi aktywność na wyświetlaczu, ta aktywność może uruchomić inne aktywności na tym wyświetlaczu. W związku z tym właściciel jest odpowiedzialny za ograniczanie dostępu i zezwalanie na dostęp tylko zaufanym aplikacjom.
Dodatkowo do wyświetlaczy wirtualnych dodano więcej ograniczeń, ponieważ każda aplikacja może utworzyć taki wyświetlacz bez informowania o tym użytkownika. 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 LaunchParamsController
, który przechwytuje wszystkie uruchamiania aktywności i pozwala komponentowi systemowemu modyfikować parametry używane do uruchamiania. Jest ona dostępna w języku system_server
.
Konfigurowanie ustawień okna wyświetlacza 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 na ekranie mają się wyświetlać elementy systemu (launcher, tapeta, pasek nawigacyjny i inne okna) oraz IME.
Więcej informacji znajdziesz w artykułach DisplayWindowSettings#shouldShowSystemDecorsLocked()
i DisplayWindowSettings#shouldShowImeLocked()
.
Aby zidentyfikować wyświetlacz, użyj unikalnego identyfikatora (domyślnie jest używany identyfikator DisplayInfo#uniqueId
) lub identyfikatora portu fizycznego w przypadku wyświetlaczy sprzętowych (patrz DisplayInfo#address
).
Na przykład w tym przykładzie konfiguracji wyświetlania włączono ozdoby systemowe i system rozpoznawania pisma 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"
.
Inną opcją jest użycie informacji o porcie sprzętowym i ustawienie wartości identifier="1"
odpowiadającej wartości DisplayWindowSettings#IDENTIFIER_PORT
, a następnie zaktualizowanie nazwy, aby używała 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: