Zalecane metody

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()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: