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 angezeigt 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) den Fold erkennen, bestimmen, ob eine Aktion ausgeführt werden kann, 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 verbessert die Fragmentierung.

Zugriff auf Displays einschränken

Wenn der Zugriff auf ein oder mehrere Bildschirme aufgrund der Gerätekonfiguration eingeschränkt werden muss, sollten Sie diese mit dem Flag Display#FLAG_PRIVATE als privat kennzeichnen. Nur der Eigentümer kann dann keine Inhalte mehr hinzufügen. Jeder Versuch, eine Aktivität zu starten oder ein Fenster hinzuzufügen, und zwar von allen Personen außer dem Inhaber, führt zu einem 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

Systemdesigns können für jeden Bildschirm 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, Hintergrund, Navigationsleiste und andere Dekorfenster) und die IME auf einem Display angezeigt werden. Weitere Informationen finden Sie unter DisplayWindowSettings#shouldShowSystemDecorsLocked() und DisplayWindowSettings#shouldShowImeLocked().

Verwende zum Identifizieren des Bildschirms entweder eine eindeutige ID (in dieser Standardeinstellung wird DisplayInfo#uniqueId verwendet) 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 "local:45354385242535243453" ein Beispielwert sein. Eine weitere Option besteht darin, Hardware-Portinformationen zu verwenden und identifier="1" so festzulegen, dass es mit DisplayWindowSettings#IDENTIFIER_PORT übereinstimmt. 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