Im Folgenden finden Sie die Aktualisierungen, die an diesen Display-spezifischen Bereichen vorgenommen wurden:
Systemdesigns
Android 10 unterstützt die Konfiguration von sekundären zur Anzeige bestimmter Systemdesigns wie Hintergrund, Navigationsleiste, und Launcher. Standardmäßig werden auf dem primären Display alle Elemente des Systems angezeigt. sekundäre Bildschirme die optional aktivierten. Unterstützung für einen Eingabemethoden-Editor (IME) kann unabhängig von anderen Systemdesigns festgelegt werden.
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
verwenden
um Systemdesigns auf einem bestimmten Display zu unterstützen oder
einen Standardwert in /data/system/display_settings.xml
. Beispiele:
Weitere Informationen finden Sie unter Anzeigefenstereinstellungen.
Implementierung
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
ist auch betroffen in
WindowManager#setShouldShowSystemDecors()
zum Testen. Diese Methode auslösen
mit der Absicht, System-Dekors zu aktivieren, werden keine Dekorfenster hinzugefügt,
zuvor fehlen, oder entfernen Sie sie, falls sie zuvor vorhanden waren. In den meisten
wird die Änderung der Unterstützung für die Systemgestaltung erst nach einer
Gerät neu gestartet.
Prüft auf Unterstützung von Systemdesigns in der WindowManager-Codebasis
laufen in der Regel DisplayContent#supportsSystemDecorations()
, während
sucht nach externen Diensten, z. B. der System-UI, um zu prüfen, ob die Navigationsleiste
angezeigt werden sollen) verwenden Sie WindowManager#shouldShowSystemDecors()
.
Um zu verstehen, was mit dieser Einstellung gesteuert wird, sehen Sie sich die Aufrufpunkte der
diese Methoden anwenden.
Dekorfenster der System-UI
Android 10 unterstützt jetzt Fenster mit Systemdekoration
nur für die Navigationsleiste, da sie für
zum Wechseln zwischen Aktivitäten und Apps. Standardmäßig wird in der Navigationsleiste
Angebote für zu Hause und zu Hause. Dies ist nur enthalten, wenn die Zielanzeige
System-Dekorationen (siehe DisplayWindowSettings
).
Die Statusleiste ist ein komplizierteres Systemfenster, enthält auch die Benachrichtigungsleiste, die Schnelleinstellungen und den Sperrbildschirm. In Android 10 gesetzt ist, wird die Statusleiste auf sekundären Bildschirmen nicht unterstützt. Daher sind Benachrichtigungen, Einstellungen und ein vollständiger Keyguard nur auf der primären Displays.
Das Systemfenster Overview/Recents (Übersicht/Letzte) wird auf sekundären Geräten nicht unterstützt. Bildschirmen. In Android 10 zeigt AOSP auf der Seite Standardanzeige und enthält Aktivitäten von allen Bildschirmen. Bei Aktivierung über „Letzte“ wird eine Aktivität, die auf einem zweiten Display angezeigt wurde, die standardmäßig angezeigt werden. Bei diesem Ansatz sind einige bekannte Probleme aufgetreten, z. B. werden sofort aktualisiert, wenn Apps auf anderen Bildschirmen erscheinen.
Implementierung
Zur Implementierung zusätzlicher Funktionen der System-UI sollten Gerätehersteller eine einzelne System-UI-Komponente, die das Hinzufügen/Entfernen von Bildschirmen und präsentiert angemessene Inhalte.
Eine System-UI-Komponente, die Multi-Display (MD) unterstützt, sollte die folgenden Fällen:
- Mehrere Bildschirme beim Start initialisieren
- Anzeige zur Laufzeit hinzugefügt
- Anzeige zur Laufzeit entfernt
Wenn die Systembenutzeroberfläche erkennt, dass vor WindowManager eine Anzeige hinzugefügt wurde, erstellt sie
eine Race-Bedingung. Sie können dies vermeiden, indem Sie einen benutzerdefinierten Callback von
WindowManager auf die System-Benutzeroberfläche umstellen, wenn eine Anzeige hinzugefügt wird, anstatt sie zu abonnieren
DisplayManager.DisplayListener
-Ereignisse. Für eine Referenzimplementierung
Weitere Informationen zu Navigationsleisten findest du unter CommandQueue.Callbacks#onDisplayReady
und WallpaperManagerInternal#onDisplayReady
für Hintergrundbilder.
Außerdem bietet Android 10 folgende Updates:
- Die Klasse
NavigationBarController
steuert alle Funktionen. speziell für Navigationsleisten. - Informationen zum Aufrufen einer benutzerdefinierten Navigationsleiste finden Sie unter
CarStatusBar
. TYPE_NAVIGATION_BAR
ist nicht mehr auf einen einzelnen -Instanz und kann pro Anzeige verwendet werden.IWindowManager#hasNavigationBar()
wird aktualisiert und enthält jetzt Folgendes:displayId
-Parameter nur für die System-UI.
Werfer
In Android 10 wurde jeder Bildschirm so konfiguriert, dass er
Das System verfügt über einen eigenen Home-Stack für Launcher-Aktivitäten mit dem Typ
Standardmäßig WindowConfiguration#ACTIVITY_TYPE_HOME
. Jeder Bildschirm
verwendet eine separate Instanz der Launcher-Aktivität.
Abbildung 1: Multi-Display-Launcher-Beispiel für
platform/development/samples/MultiDisplay
Die meisten vorhandenen Launcher unterstützen mehrere Instanzen nicht und sind nicht optimiert
für große Bildschirme. Außerdem wird oft eine andere Erfahrung erwartet.
auf sekundären/externen Bildschirmen. Um eine spezielle Aktivität für die Sekundarstufe zu bieten
wird mit Android 10 die Kategorie SECONDARY_HOME
eingeführt.
Filter. Instanzen dieser Aktivität werden auf allen Bildschirmen verwendet, die Systemfunktionen unterstützen
Dekorationen, eins pro Display.
<activity> ... <intent-filter> <category android:name="android.intent.category.SECONDARY_HOME" /> ... </intent-filter> </activity>
Die Aktivität muss einen Startmodus haben, der nicht verhindert, dass mehrere
und sich an unterschiedliche Bildschirmgrößen anpassen. Der Launch-Modus
darf nicht singleInstance
oder singleTask
sein.
Implementierung
In Android 10: RootActivityContainer#startHomeOnDisplay()
wählt automatisch je nach Anzeige die gewünschte Komponente und den gewünschten Intent aus.
wenn der Startbildschirm gestartet wird. RootActivityContainer#resolveSecondaryHomeActivity()
enthält die Logik für die Suche nach der Komponente für die Launcher-Aktivität
ausgewählten Launcher und kann bei Bedarf die Standardeinstellung des Systems verwenden (siehe
ActivityTaskManagerService#getSecondaryHomeIntent()
).
Sicherheitseinschränkungen
Zusätzlich zu den Einschränkungen, die für Aktivitäten auf sekundären Displays gelten, um zu vermeiden, dass eine schädliche App eine virtuelle Anzeige mit aktivierten Systemeinrichtung und vertrauliche Informationen von der Oberfläche lesen, erscheint der Launcher nur auf virtuellen Displays eines Systems darstellen. Die Übersicht zeigt keine Inhalte auf nicht systemeigenen virtuellen Displays.
Hintergründe
Ab Android 10 werden Hintergründe unterstützt. auf sekundären Displays:
Abbildung 2: Live-Hintergrund für interne (oben) und externe wird unten angezeigt
Entwickler können die Unterstützung für die Hintergrundfunktion erklären, indem sie
android:supportsMultipleDisplays="true"
im
WallpaperInfo
-XML-Definition. Auch Hintergrundentwickler sind
werden Assets mit dem Anzeigekontext in
WallpaperService.Engine#getDisplayContext()
Das Framework erstellt eine WallpaperService.Engine
-Instanz
pro Anzeige, sodass jede Suchmaschine ihre eigene Oberfläche und ihren eigenen Anzeigekontext hat. Die
müssen Entwickler sicherstellen, dass jede Suchmaschine
unabhängig voneinander zeichnen kann,
unterschiedliche Framerates an, unter Berücksichtigung von VSYNC.
Hintergründe für einzelne Bildschirme auswählen
Android 10 bietet keine direkte Plattformunterstützung für die Auswahl von Hintergründen.
für einzelne Bildschirme anpassen. Eine stabile Display-ID ist
erforderlich, um Hintergrundeinstellungen pro Display beizubehalten.
Display#getDisplayId()
ist dynamisch. Es gibt also keine Garantie dafür, dass ein
Der physische Bildschirm hat nach dem Neustart dieselbe ID.
Android 10 hat jedoch DisplayInfo.mAddress
,
die stabile Kennzeichnungen für physische Displays enthält und für einen vollständigen
zu implementieren. Leider ist es zu spät, die Logik zu implementieren.
für Android 10. Vorgeschlagene Lösung:
- Verwende die
WallpaperManager
API, um die Hintergründe festzulegen. WallpaperManager
wird vonContext
abgerufen -Objekt enthält, wobei jedesContext
-Objekt Informationen über entsprechende Display (Context#getDisplay()/getDisplayId()
) Daher können SiedisplayId
von einerWallpaperManager
-Instanz abrufen ohne neue Methoden hinzuzufügen.- Für das Framework verwenden Sie
displayId
aus einemContext
-Objekt und ordnen es einer statischen ID (z. B. Port von eines physischen Bildschirms). Verwenden Sie die statische ID, um den ausgewählten Hintergrund beizubehalten.
Bei dieser Problemumgehung werden vorhandene Implementierungen für die Hintergrundauswahl verwendet. Wenn es auf einem bestimmten Display geöffnet wird und den richtigen Kontext verwendet, zum Festlegen eines Hintergrunds aufruft, kann das System das Display automatisch erkennen.
Wenn der Hintergrund für ein anderes Display als das aktuelle
Anzeige und erstellen Sie dann ein neues Context
-Objekt für die Zielanzeige
(Context#createDisplayContext
) und erhalten Sie die
WallpaperManager
-Instanz aus dieser Anzeige aus.
Sicherheitseinschränkungen
Das System zeigt keine Hintergründe auf virtuellen Displays an, die es nicht besitzt. Grund dafür sind Sicherheitsbedenken, dass eine schädliche App eine virtuelle mit aktivierter Systemgestaltungs-Unterstützung anzeigen und eine von der Oberfläche stammen (z. B. ein persönliches Foto).
Implementierung
In Android 10 enthält die IWallpaperConnection#attachEngine()
und IWallpaperService#attach()
akzeptieren die
displayId
, um Verbindungen pro Display zu erstellen.
WallpaperManagerService.DisplayConnector
kapselt ein Pro-Display ein.
Hintergrund-Engine und Verbindung. In WindowManager werden Hintergrund-Controller
die für jedes DisplayContent
-Objekt bei der Konstruktion erstellt wurden,
einen einzigen WallpaperController
für alle Bildschirme.
Einige Implementierungen der öffentlichen WallpaperManager
-Methoden (z. B.
WallpaperManager#getDesiredMinimumWidth()
) wurden auf folgende Berechnungsart aktualisiert:
und stellen Informationen für entsprechende Displays bereit.
WallpaperInfo#supportsMultipleDisplays()
und eine entsprechende
Ressourcenattribute hinzugefügt, sodass App-Entwickler angeben können,
Hintergründe für mehrere Bildschirme bereit.
Wenn der auf dem Standardbildschirm angezeigte Hintergrunddienst keine mehrere Bildschirme, dann zeigt das System den Standardhintergrund auf dem zweiten Bildschirm an. angezeigt wird.
Abbildung 3: Hintergrund-Fallback-Logik für sekundäre Bildschirme