Apps für faltbare Geräte und Geräte mit mehreren Bildschirmen
Im Allgemeinen sollten Anwendungen nicht auf statischen Kennungen oder einer Logik basieren, die von einigen Anzeige-IDs abhängig ist. 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 darauf reagieren und den Start dann auf einem bestimmten Display ausfü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 verbessert die Fragmentierung.
Zugriff auf Displays beschrä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.
Darüber hinaus können Elemente auf einem Bildschirm immer auf diesen Bildschirm zugreifen. Wenn der Inhaber 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ü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 die virtuelle Anzeige nicht dem System gehört, sind nur Aktivitäten mit allowEmbedded
zulässig und der Aufrufer sollte die Berechtigung ACTIVITY_EMBEDDING
haben.
Weitere Informationen
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Verwende LaunchParamsController
, um Aktivitätsstarts bedingt zu steuern. Damit werden alle Aktivitätsstarts abgefangen und eine Systemkomponente kann die für den Start verwendeten Parameter ändern. Diese Funktion ist in system_server
verfügbar.
Einstellungen für das Displayfenster und die Systemgestaltung 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 die Anzeigekonfiguration werden die Systemgestaltung und der 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