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 einige Display-IDs. Meistens sollten Apps ihre Größe anpassen und 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) das um zu ermitteln, ob eine Aktion angemessen ist, und starten Sie 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: erhöht die Fragmentierung.

Zugriff auf Displays beschrä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.

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 werden virtuelle Anzeigen mit weiteren Einschränkungen versehen, da jede App ohne es für Nutzende 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 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 eine eindeutige ID. Bei dieser Standardeinstellung wird DisplayInfo#uniqueId) oder eine physische Port-ID für Hardware angezeigt wird (siehe DisplayInfo#address).

Im folgenden Beispiel für eine Displaykonfiguration sind 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 Beispiel oben wird uniqueId zur Identifizierung von Displays verwendet. im Attribut „name“, das für eine simulierte Anzeige overlay:1 ist. 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 Anzeige-IDs.

Weitere Informationen