Best Practices

Apps für faltbare Geräte und Geräte mit mehreren Bildschirmen

Im Allgemeinen sollten Apps nicht auf statischen Kennungen oder Logik basieren, die von bestimmten Display-IDs abhängt. In den meisten Fällen sollten Apps ihre Größe anpassen und auf verschiedenen Displays funktionieren. Das System sollte steuern, wo Apps platziert werden. So können Sie beispielsweise eine neue und einzigartige Nutzererfahrung für Foldables entwickeln und eine spezielle App auf dem externen Display starten, wenn das Gerät zusammengeklappt ist.

In diesem Fall sollte SystemUI (oder eine andere Systemkomponente) die Faltung erkennen, feststellen, ob es angemessen ist, eine Aktion auszuführen, und dann die Zielaktivität starten und eine externe Display-ID als Startziel angeben. Apps dürfen diese Aktion nicht erkennen oder darauf reagieren und dann die App auf einem bestimmten Display starten. Gehen Sie also nicht davon aus, dass das, was auf einem Gerät funktioniert, auch auf anderen Geräten funktioniert. Kurz gesagt: Gerätespezifischer Code erhöht die Fragmentierung.

Zugriff auf Displays einschränken

Wenn für die Gerätekonfiguration der Zugriff auf ein oder mehrere Displays eingeschränkt werden muss, empfiehlt es sich, das Flag Display#FLAG_PRIVATE zu verwenden, um solche Displays als privat zu kennzeichnen. Dadurch wird verhindert, dass andere Nutzer als der Inhaber Inhalte auf dem Display hinzufügen können. Jeder Versuch, eine Aktivität zu starten oder ein Fenster hinzuzufügen, der nicht vom Eigentümer erfolgt, führt zu einem SecurityException. Wenn das System das Display besitzt, kann es Fenster hinzufügen und Aktivitäten starten.

Außerdem können auf einem Display platzierte Einheiten immer auf dieses Display zugreifen. Wenn der Eigentümer eine Aktivität auf einem Display startet, kann die Aktivität andere Aktivitäten auf diesem Display starten. Daher ist der Inhaber dafür verantwortlich, den Zugriff einzuschränken und nur vertrauenswürdige Apps zuzulassen.

Außerdem werden virtuelle Displays stärker eingeschränkt, da jede App ein solches Display erstellen kann, ohne es für den Nutzer sichtbar zu machen. Wenn die virtuelle Anzeige nicht dem System gehört, sind nur Aktivitäten mit allowEmbedded zulässig und der Aufrufer muss die Berechtigung ACTIVITY_EMBEDDING haben.

Weitere Informationen

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

Wenn Sie den Start von Aktivitäten bedingt steuern möchten, verwenden Sie LaunchParamsController. Damit werden alle Aktivitätsstarts abgefangen und eine Systemkomponente kann die für den Start verwendeten Parameter ändern. Diese Funktion ist in system_server verfügbar.

Einstellungen für die Fensterdarstellung und Systemdekorationen konfigurieren

Systemdekorationen können pro Display in DisplayWindowSettings konfiguriert werden. Eine Geräteimplementierung kann eine Standardkonfiguration in /data/system/display_settings.xml bereitstellen.

Mit diesem Wert wird festgelegt, ob Systemdekorationen (Launcher, Hintergrundbild, Navigationsleiste und andere Dekorfenster) und die IME auf einem Display angezeigt werden. Weitere Informationen finden Sie unter DisplayWindowSettings#shouldShowSystemDecorsLocked() und DisplayWindowSettings#shouldShowImeLocked().

Verwenden Sie entweder eine eindeutige ID (standardmäßig wird DisplayInfo#uniqueId verwendet) oder eine physische Anschluss-ID für Hardware-Displays (siehe DisplayInfo#address), um das Display zu identifizieren.

Das folgende Beispiel für eine Displaykonfiguration aktiviert beispielsweise Systemdekorationen 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 obigen Beispiel wird uniqueId zur Anzeige-ID im Namensattribut verwendet, die für eine simulierte Anzeige overlay:1 ist. Bei einem integrierten Display kann ein Beispielwert "local:45354385242535243453" sein. Eine weitere Option ist, die Informationen zum Hardwareanschluss zu verwenden und identifier="1" auf DisplayWindowSettings#IDENTIFIER_PORT festzulegen. Aktualisieren Sie dann den Namen, sodass er das Format "port:<port_id>" verwendet:

<?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 Display-IDs.

Weitere Informationen