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