Zalecane metody

Aplikacje na urządzenia składane i urządzenia z wieloma ekranami

Ogólnie rzecz biorąc, aplikacje nie powinny polegać na statycznych identyfikatorach ani logice zależnej 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ć lokalizację aplikacji. Na przykład, aby stworzyć nowe i unikalne doświadczenie dla urządzeń składanych 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 należy wykonać akcję, a następnie uruchomić działanie docelowe i określić zewnętrzny identyfikator wyświetlacza jako cel uruchomienia. Aplikacje nie powinny wykrywać tej akcji ani wykonywać w odpowiedzi żadnej akcji, a następnie uruchamiać się na określonym ekranie. 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 specyficzny dla urządzenia zwiększa fragmentację.

Ogranicz dostęp do wyświetlaczy

Jeśli konfiguracja urządzenia wymaga ograniczenia dostępu do jednego lub większej liczby wyświetlaczy, zaleca się użycie flagi Display#FLAG_PRIVATE w celu oznaczenia takich wyświetlaczy jako prywatnych . Spowoduje to ograniczenie możliwości dodawania treści do wyświetlacza wszystkim osobom oprócz właściciela. Każda próba uruchomienia działania lub dodania okna przez kogokolwiek innego niż właściciel skutkuje SecurityException . Jeśli system jest właścicielem wyświetlacza, może dodawać okna i uruchamiać działania.

Ponadto elementy umieszczone na wyświetlaczu zawsze mają do niego dostęp. Jeśli właściciel uruchomi czynność na wyświetlaczu, wówczas czynność ta może uruchomić inne czynności na tym ekranie. W rezultacie właściciel jest odpowiedzialny za ograniczanie dostępu i zezwalanie tylko na zaufane aplikacje.

Ponadto do wyświetlaczy wirtualnych dodano więcej ograniczeń, ponieważ dowolna aplikacja może je utworzyć bez udostępniania ich użytkownikowi. Jeśli wirtualny wyświetlacz nie jest własnością systemu, dozwolone są tylko działania z allowEmbedded , a osoba wywołująca powinna mieć uprawnienie ACTIVITY_EMBEDDING .

Aby uzyskać więcej informacji, zobacz:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

Aby warunkowo kontrolować uruchamianie działań, użyj LaunchParamsController , który przechwytuje wszystkie uruchomienia działań i pozwala komponentowi systemu modyfikować parametry używane do uruchamiania. Jest to dostępne w system_server .

Skonfiguruj ustawienia okien wyświetlania i dekoracje systemu

Dekoracje systemu można skonfigurować dla każdego wyświetlacza w DisplayWindowSettings . Implementacja urządzenia może zapewnić domyślną konfigurację w /data/system/display_settings.xml .

Ta wartość określa, czy dekoracje systemu (program uruchamiający, tapeta, pasek nawigacyjny i inne okna dekoracyjne) oraz edytor IME będą wyświetlane na wyświetlaczu. Aby uzyskać szczegółowe informacje, zobacz DisplayWindowSettings#shouldShowSystemDecorsLocked() i DisplayWindowSettings#shouldShowImeLocked() .

Aby zidentyfikować wyświetlacz, użyj unikalnego identyfikatora (domyślnie używa DisplayInfo#uniqueId ) lub identyfikatora portu fizycznego w przypadku wyświetlaczy sprzętowych (zobacz DisplayInfo#address ).

Na przykład poniższy przykład konfiguracji wyświetlacza włącza dekoracje systemowe i edytor 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 powyższym przykładzie uniqueId służy do identyfikacji wyświetlacza w atrybucie name, który w przypadku symulowanego wyświetlania jest overlay:1 . W przypadku wbudowanego wyświetlacza przykładowa wartość może mieć postać "local:45354385242535243453" . Inną opcją jest użycie informacji o porcie sprzętowym i ustawienie identifier="1" tak, aby odpowiadał 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>

Aby uzyskać szczegółowe informacje, zobacz sekcję Statyczne identyfikatory wyświetlane .

Aby uzyskać więcej informacji, zobacz: