Unterstützung für Systemdesigns

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:

  1. Verwende die WallpaperManager API, um die Hintergründe festzulegen.
  2. WallpaperManager wird von Context abgerufen -Objekt enthält, wobei jedes Context-Objekt Informationen über entsprechende Display (Context#getDisplay()/getDisplayId()) Daher können Sie displayId von einer WallpaperManager-Instanz abrufen ohne neue Methoden hinzuzufügen.
  3. Für das Framework verwenden Sie displayId aus einem Context-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