Best Practices

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

Generell sollten Apps nicht auf statische Kennungen oder Logik angewiesen sein, die von bestimmten Anzeigen-IDs abhängt. In den meisten Fällen sollten Apps die Größe ändern und auf verschiedenen Displays funktionieren. Das System sollte festlegen, wo Apps abgelegt werden. So können Sie beispielsweise eine neue und einzigartige Funktion für faltbare Geräte 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) das Zusammenklappen erkennen, feststellen, ob eine Aktion ausgeführt werden soll, und dann die Zielaktivität starten und eine externe Display-ID als Startziel angeben. Apps dürfen diese Aktion nicht erkennen oder als Reaktion darauf eine Aktion ausführen und dann die App auf einem bestimmten Display starten. Angenommen, Sie haben ein Design für ein bestimmtes Gerät erstellt. Das bedeutet nicht, dass es auch auf anderen Geräten funktioniert. Kurz gesagt: Gerätespezifischer Code erhöht die Fragmentierung.

Zugriff auf Displays einschränken

Wenn die Gerätekonfiguration den Zugriff auf ein oder mehrere Displays einschränken muss, sollten Sie diese Displays mit dem Flag Display#FLAG_PRIVATE als privat kennzeichnen. Dadurch können nur der Eigentümer und Nutzer mit der entsprechenden Berechtigung Inhalte zum Display hinzufügen. Alle Versuche, eine Aktivität zu starten oder ein Fenster hinzuzufügen, die nicht vom Eigentümer stammen, führen zu einer SecurityException. Wenn das System Inhaber des Displays ist, kann es Fenster hinzufügen und Aktivitäten starten.

Außerdem können Entitäten, die auf einem Display platziert sind, jederzeit auf dieses Display zugreifen. Wenn der Eigentümer eine Aktivität auf einem Display startet, kann diese Aktivität andere Aktivitäten auf diesem Display starten. Daher ist der Eigentümer dafür verantwortlich, den Zugriff einzuschränken und nur vertrauenswürdigen Apps zu erlauben.

Außerdem gelten für virtuelle Displays weitere Einschränkungen, da jede App ein solches Display erstellen kann, ohne es für den Nutzer sichtbar zu machen. Wenn das virtuelle Display 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 einer Systemkomponente wird ermöglicht, die für den Start verwendeten Parameter zu ändern. Diese Funktion ist in system_server verfügbar.

Einstellungen für Fenster und Systemdekorationen konfigurieren

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

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

Verwenden Sie zum Identifizieren des Displays entweder eine eindeutige ID (standardmäßig DisplayInfo#uniqueId) oder eine physische Port-ID für Hardware-Displays (siehe DisplayInfo#address).

Im folgenden Beispiel für eine Displaykonfiguration werden Systemdekorationen und die IME auf einem simulierten Display aktiviert:

<?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 im Attribut „Name“ zur Identifizierung des Displays verwendet. Bei einem simulierten Display ist das overlay:1. Bei einem integrierten Display kann ein Beispielwert "local:45354385242535243453" sein. Eine weitere Option besteht darin, Hardware-Portinformationen zu verwenden und identifier="1" auf DisplayWindowSettings#IDENTIFIER_PORT festzulegen. Aktualisieren Sie dann den Namen im "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>

Weitere Informationen finden Sie unter Statische Anzeigen-IDs.

Weitere Informationen