Best Practices

Apps für faltbare Geräte und Multiscreen-Geräte

Im Allgemeinen sollten Apps nicht auf statischen Kennungen oder einer Logik basieren, die von einige Display-IDs. In den meisten Fällen sollte die Größe von Apps angepasst werden, damit sie auf verschiedenen Displays funktionieren. und das System steuert, wo Apps gefunden werden. Um beispielsweise eine für faltbare Geräte und eine spezielle App auf der externen Bildschirm, wenn das Gerät zugeklappt ist.

In diesem Fall sollte die SystemUI (oder eine andere Systemkomponente) die Seite zu öffnen, zu bestimmen, ob eine Aktion angemessen ist, und Zielaktivität fest und gib eine externe Display-ID als Startziel an. Apps dürfen diese Aktion nicht erkennen oder darauf reagieren. um den Start auf einem bestimmten Display durchzuführen. Mit anderen Worten: Gehen Sie nicht davon aus, was auf einem Gerät funktioniert, auch auf anderen Geräten. Kurz gesagt: Code erhöht die Fragmentierung.

Zugriff auf Displays beschränken

Ob der Zugriff aufgrund der Gerätekonfiguration auf eine oder mehrere angezeigt wird, empfiehlt es sich, das Flag Display#FLAG_PRIVATE zu verwenden um solche Displays als privat zu kennzeichnen. Dadurch werden alle dem Display Inhalte hinzufügen kann. Jeder Versuch, eine Aktivität zu starten Fenster nur vom Eigentümer hinzufügen, ergibt sich ein SecurityException. Wenn das Display dem System gehört, kann das System Fenster hinzufügen und Aktivitäten starten.

Darüber hinaus können Elemente auf einem Bildschirm immer auf diesen Bildschirm zugreifen. Wenn der Eigentümer eine Aktivität auf einem Display startet, kann die Aktivität andere Aktivitäten auf diesem Display. Daher ist der Inhaber dafür verantwortlich, nur vertrauenswürdige Apps.

Darüber hinaus gibt es für virtuelle Displays weitere Einschränkungen, da jede App ohne es für Nutzende sichtbar zu machen. Wenn die virtuelle Anzeige nicht gehören, dann werden nur Aktivitäten mit allowEmbedded sind zulässig und der Aufrufer sollte die ACTIVITY_EMBEDDING Berechtigung.

Weitere Informationen

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

Wenn Sie Aktivitätsstarts bedingt steuern möchten, verwenden Sie LaunchParamsController, das alle Aktivitätsstarts abfängt und es einer Systemkomponente ermöglicht, Parameter, die für den Start verwendet werden. Dies ist in system_server verfügbar.

Einstellungen für die Fensteranzeige und die Systemgestaltung konfigurieren

Systemdesigns können kann für die einzelnen Displays in DisplayWindowSettings konfiguriert werden. Ein Gerät kann die Implementierung eine Standardkonfiguration /data/system/display_settings.xml

Dieser Wert bestimmt, ob die Systemeinrichtung (Launcher, Hintergrund, Navigationsleiste und andere Dekorfenster) und der IME wird auf dem Display angezeigt. Weitere Informationen finden Sie unter DisplayWindowSettings#shouldShowSystemDecorsLocked(). und DisplayWindowSettings#shouldShowImeLocked().

Verwenden Sie zur Identifizierung des Displays entweder eine eindeutige ID (diese Standardeinstellung verwendet DisplayInfo#uniqueId) oder eine physische Port-ID für Hardware angezeigt wird (siehe DisplayInfo#address).

Mit dem folgenden Beispiel für die Anzeigekonfiguration werden Systemdesigns und die IME auf einem simulierten Display:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="0" />
<display
  name="overlay:1"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Im Beispiel oben wird uniqueId zur Identifizierung von Displayanzeigen verwendet. im Attribut „name“, das für eine simulierte Anzeige overlay:1 ist. Bei einem integrierten Display kann ein Beispielwert "local:45354385242535243453" sein. Sie können auch Informationen zum Hardwareport verwenden und identifier="1" festlegen um DisplayWindowSettings#IDENTIFIER_PORT zu entsprechen, und aktualisieren Sie dann Name, um das Format "port:<port_id>" zu verwenden:

<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="1" />
<display
  name="port:12345"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Weitere Informationen finden Sie unter Statische Anzeige-IDs.

Weitere Informationen