Zalecane metody

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