Zalecane praktyki

Aplikacje na urządzenia składane i wieloekranowe

Ogólnie aplikacje nie powinny polegać na statycznych identyfikatorach lub 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ć, gdzie znajdują się aplikacje. Na przykład, aby zbudować nowe i unikalne doświadczenie dla składanych urządzeń i uruchomić specjalną aplikację na zewnętrznym ekranie, gdy urządzenie jest złożone.

W takim przypadku SystemUI (lub inny składnik systemu) powinien wykryć zawinięcie, określić, czy należy wykonać akcję, a następnie uruchomić działanie docelowe i określić zewnętrzny identyfikator wyświetlania jako cel uruchamiania. Aplikacje nie powinny wykrywać tej czynności ani wykonywać żadnej czynności w odpowiedzi, 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ę.

Ograniczanie dostępu do wyświetlaczy

Jeśli konfiguracja urządzenia wymaga ograniczenie dostępu do jednego lub więcej wyświetlaczy, zaleca się korzystanie z Display#FLAG_PRIVATE flagę do wyznaczenia takich wyświetlaczy jako prywatne. Takie postępowanie ogranicza możliwość dodawania treści do wyświetlacza wszystkim oprócz właściciela. Każda próba uruchomienia działalności lub dodać okno przez nikogo, ale z wyników właścicielami w SecurityException . Jeśli system jest właścicielem wyświetlacza, system może dodawać okna i uruchamiać działania.

Ponadto podmioty umieszczone na wyświetlaczu zawsze mają dostęp do tego wyświetlacza. Jeśli właściciel uruchomi działanie na ekranie, to działanie może uruchomić inne działania na tym ekranie. W rezultacie, właściciel jest odpowiedzialny za ograniczenie dostępu i pozwalając tylko zaufane aplikacje.

Ponadto do wirtualnych wyświetlaczy dodano więcej ograniczeń, ponieważ dowolna aplikacja może je utworzyć bez pokazywania ich użytkownikowi. Jeśli wirtualny wyświetlacz nie jest własnością przez system, to tylko zajęcia z allowEmbedded są dozwolone, a rozmówca powinien mieć ACTIVITY_EMBEDDING zgody.

Aby uzyskać więcej informacji, zobacz:

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

Warunkowo kontrolować uruchamia aktywności, użyj LaunchParamsController , który przechwytuje wszystkie starty aktywności i pozwala komponent systemu, aby zmodyfikować parametry wykorzystywane do uruchomienia. Jest ona dostępna w system_server .

Konfigurowanie ustawień okien wyświetlania i dekoracji systemu

Dekoracje systemowe mogą być konfigurowane na wyświetlaczu w DisplayWindowSettings . Implementacja urządzenie może dostarczyć standardowej konfiguracji /data/system/display_settings.xml .

Ta wartość określa, czy dekoracje systemowe (program uruchamiający, tapeta, pasek nawigacyjny i inne okna dekoracji) oraz edytor IME będą wyświetlane na ekranie. Szczegółowe informacje można znaleźć DisplayWindowSettings#shouldShowSystemDecorsLocked() i DisplayWindowSettings#shouldShowImeLocked() .

Aby zidentyfikować wyświetlacza, użyj jednej unikatowy identyfikator (to domyślne zastosowania DisplayInfo#uniqueId ) lub fizyczny ID port dla monitorów sprzętowych (patrz DisplayInfo#address ).

Na przykład poniższy przykład konfiguracji wyświetlania włącza dekoracje systemu 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 graficznej atrybutu name, który dla symulowanego wyświetlacz jest overlay:1 . Na wbudowanym wyświetlaczu wartość próbka może być "local:45354385242535243453" . Innym rozwiązaniem jest wykorzystanie informacji portu sprzętowe i ustaw identifier="1" odpowiada DisplayWindowSettings#IDENTIFIER_PORT a następnie zaktualizować nazwę korzystania z "port:<port_id>" format:

<?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 można znaleźć statycznych wyświetlania identyfikatorów .

Aby uzyskać więcej informacji, zobacz: