Best Practices

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

Im Allgemeinen sollten Apps nicht auf statischen Bezeichnern oder Logik basieren, die von einigen Anzeige-IDs abhängt. In den meisten Fällen sollten Apps ihre Größe ändern und auf verschiedenen Displays funktionieren, und das System sollte steuern, wo Apps gefunden werden. Zum Beispiel, um ein neues und einzigartiges Erlebnis für faltbare Geräte zu schaffen und eine spezielle App auf dem externen Bildschirm zu starten, wenn das Gerät zusammengeklappt ist.

In diesem Fall sollte SystemUI (oder eine andere Systemkomponente) die Falte erkennen, feststellen, ob es angemessen ist, eine Aktion auszuführen, und dann die Zielaktivität starten und eine externe Anzeige-ID als Startziel angeben. Apps sollten diese Aktion nicht erkennen oder als Reaktion darauf eine Aktion ausführen und dann den Start auf einem bestimmten Display durchführen. Mit anderen Worten: Gehen Sie 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.

Beschränken Sie den Zugriff auf Displays

Wenn die Gerätekonfiguration die Beschränkung des Zugriffs auf eine oder mehrere Anzeigen erfordert, empfiehlt es sich, das Flag Display#FLAG_PRIVATE zu verwenden, um solche Anzeigen als privat zu kennzeichnen. Dadurch wird verhindert, dass alle außer dem Eigentümer Inhalte zur Anzeige hinzufügen können. Jeder Versuch, eine Aktivität zu starten oder ein Fenster hinzuzufügen, durch jemand anderen als den Eigentümer, führt zu einer SecurityException . Wenn das System Eigentümer der Anzeige ist, kann das System Fenster hinzufügen und Aktivitäten starten.

Darüber hinaus können auf einer Anzeige platzierte Entitäten jederzeit auf diese Anzeige 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 Eigentümer dafür verantwortlich, den Zugriff einzuschränken und nur vertrauenswürdige Apps zuzulassen.

Darüber hinaus werden den virtuellen Anzeigen weitere Einschränkungen hinzugefügt, da jede App eine solche erstellen kann, ohne sie für den Benutzer sichtbar zu machen. Wenn die virtuelle Anzeige nicht dem System gehört, sind nur Aktivitäten mit allowEmbedded zulässig und der Aufrufer sollte über die Berechtigung ACTIVITY_EMBEDDING verfügen.

Weitere Informationen finden Sie unter:

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

Um Aktivitätsstarts bedingt zu steuern, verwenden Sie LaunchParamsController , der alle Aktivitätsstarts abfängt und es einer Systemkomponente ermöglicht, die für den Start verwendeten Parameter zu ändern. Dies ist in system_server verfügbar.

Konfigurieren Sie Anzeigefenstereinstellungen und Systemdekorationen

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

Dieser Wert bestimmt, ob Systemdekorationen (Launcher, Hintergrundbild, Navigationsleiste und andere Dekorfenster) und der IME auf einem Display angezeigt werden. Einzelheiten finden Sie unter DisplayWindowSettings#shouldShowSystemDecorsLocked() und DisplayWindowSettings#shouldShowImeLocked() .

Um die Anzeige zu identifizieren, verwenden Sie entweder eine eindeutige ID (dieser Standard verwendet DisplayInfo#uniqueId ) oder eine physische Port-ID für Hardware-Anzeigen (siehe DisplayInfo#address ).

Das folgende Anzeigekonfigurationsbeispiel aktiviert beispielsweise Systemdekorationen und den IME auf einer simulierten Anzeige:

<?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 Anzeigeidentifikation im Namensattribut verwendet, das für eine simulierte Anzeige overlay:1 lautet. Für eine integrierte Anzeige kann ein Beispielwert "local:45354385242535243453" lauten. Eine andere Möglichkeit besteht darin, Hardware-Portinformationen zu verwenden und identifier="1" so festzulegen, dass er DisplayWindowSettings#IDENTIFIER_PORT entspricht, und dann den Namen zu aktualisieren, 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>

Einzelheiten finden Sie unter Statische Anzeige-IDs .

Weitere Informationen finden Sie unter: