Gli aggiornamenti apportati a queste aree specifiche della visualizzazione sono riportati di seguito:
Decorazioni del sistema
Android 10 aggiunge il supporto per la configurazione secondaria display per mostrare alcune decorazioni del sistema, come sfondo, barra di navigazione e Avvio app. Per impostazione predefinita, il display principale mostra tutte le decorazioni del sistema e i display secondari mostrano quelli attivati facoltativi. Supporto per un editor del metodo di input (IME) può essere impostato separatamente dalle altre decorazioni del sistema.
Usa DisplayWindowSettings#setShouldShowSystemDecorsLocked()
per aggiungere il supporto per le decorazioni del sistema su un display specifico o fornire
un valore predefinito in /data/system/display_settings.xml
. Ad esempio:
consulta Impostazioni della finestra di visualizzazione.
Implementazione
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
è esposto anche in
WindowManager#setShouldShowSystemDecors()
per i test. Attivazione di questo metodo
con l'intento di abilitare decorazioni del sistema, non vengono aggiunte finestre di decorazione che sono
in precedenza mancanti o rimuoverli se erano presenti in precedenza. Nella maggior parte dei casi,
casi, la modifica del supporto delle decorazioni del sistema diventa pienamente effettiva solo dopo
riavvio dispositivo.
Verifica il supporto delle decorazioni del sistema nel codebase WindowManager
in genere percorre DisplayContent#supportsSystemDecorations()
, mentre
verifica la presenza di servizi esterni (come l'UI di sistema per controllare se la barra di navigazione)
devono essere mostrati) utilizza WindowManager#shouldShowSystemDecors()
.
Per capire cosa è controllato da questa impostazione, esplora i punti di contatto
questi metodi.
Finestre di arredamento dell'interfaccia utente di sistema
Android 10 aggiunge il supporto per l'arredamento del sistema per le finestre
solo per la barra di navigazione, perché è essenziale
per navigare tra attività e app. Per impostazione predefinita, la barra di navigazione mostra
Inviti per il rientro a casa. Viene incluso solo se il display di destinazione supporta
decorazioni del sistema (vedi DisplayWindowSettings
).
La barra di stato è una finestra di sistema più complicata contiene anche l'area notifiche, le Impostazioni rapide e la schermata di blocco. Su Android 10, la barra di stato non è supportata sui display secondari. Pertanto, le notifiche, le impostazioni e un blocco tastiera completo sono disponibili solo display principale.
La finestra di sistema Panoramica/Recenti non è supportata su schermate. In Android 10, AOSP mostra la sezione Recenti visualizzazione predefinita e contiene le attività di tutte le visualizzazioni. Se avviato da Di recente, un'attività che era su un display secondario viene mostrata in primo piano su che vengono visualizzate per impostazione predefinita. Questo approccio presenta alcuni problemi noti, tra cui la aggiornate immediatamente quando le app vengono visualizzate su altre schermate.
Implementazione
Per implementare funzionalità aggiuntive dell'interfaccia utente di sistema, i produttori di dispositivi devono utilizzare una singolo componente dell'interfaccia utente di sistema che rimane in ascolto dell'aggiunta/rimozione di display e presenti contenuti appropriati.
Un componente dell'interfaccia utente di sistema che supporta l'opzione Multi-Display (MD) deve gestire i seguenti casi:
- Inizializzazione di più display all'avvio
- Display aggiunto in fase di esecuzione
- Display rimosso in fase di esecuzione
Quando l'UI di sistema rileva l'aggiunta di una visualizzazione prima di WindowManager, crea
una gara. Per evitare questo problema, puoi implementare un callback personalizzato
WindowManager all'interfaccia utente di sistema quando viene aggiunta una visualizzazione anziché effettuare l'iscrizione
Eventi DisplayManager.DisplayListener
. Per un'implementazione di riferimento,
vedi CommandQueue.Callbacks#onDisplayReady
per il supporto della barra di navigazione
e WallpaperManagerInternal#onDisplayReady
per gli sfondi.
Inoltre, Android 10 offre i seguenti aggiornamenti:
- La classe
NavigationBarController
controlla tutte le funzionalità specifiche per le barre di navigazione. - Per visualizzare una barra di navigazione personalizzata, consulta
CarStatusBar
. TYPE_NAVIGATION_BAR
non è più limitato a una singola e può essere utilizzato per ogni visualizzazione.IWindowManager#hasNavigationBar()
è stato aggiornato per includere ParametrodisplayId
solo per l'UI di sistema.
Avvio app
In Android 10, ogni display configurato per il supporto
le decorazioni del sistema hanno uno stack della casa dedicato per le attività di avvio applicazioni con
WindowConfiguration#ACTIVITY_TYPE_HOME
, per impostazione predefinita. Ogni display
utilizza un'istanza separata dell'attività in Avvio applicazioni.
Figura 1. Esempio di Avvio app multi-display per
platform/development/samples/MultiDisplay
La maggior parte degli launcher esistenti non supporta più istanze e non è ottimizzata
per schermi di grandi dimensioni. Inoltre, spesso ci si aspetta un tipo di esperienza diverso
su display secondari/esterni. Per offrire un'attività dedicata ai
schermate, Android 10 introduce la categoria SECONDARY_HOME
nell'intent
filtri corretti. Le istanze di questa attività vengono usate su tutti i display che supportano il sistema
decorazioni, una per display.
<activity> ... <intent-filter> <category android:name="android.intent.category.SECONDARY_HOME" /> ... </intent-filter> </activity>
L'attività deve avere una modalità di avvio che non impedisca
e si adatti alle diverse dimensioni degli schermi. Modalità di avvio
non può essere singleInstance
o singleTask
.
Implementazione
In Android 10, RootActivityContainer#startHomeOnDisplay()
seleziona automaticamente il componente e l'intent desiderati a seconda del tipo
da cui viene avviata la schermata Home. RootActivityContainer#resolveSecondaryHomeActivity()
contiene la logica per cercare il componente Attività Avvio app a seconda del tipo
ha selezionato Avvio app e può usare l'impostazione predefinita di sistema, se necessario (vedi
ActivityTaskManagerService#getSecondaryHomeIntent()
).
Limitazioni di sicurezza
Oltre alle limitazioni che si applicano alle attività su display secondari, per evitare la possibilità che un'app dannosa crei un display virtuale con Decorazioni del sistema e leggendo dalla piattaforma informazioni sensibili, Avvio app appare solo su display virtuali di proprietà del sistema. In Avvio applicazioni non vengono visualizzati contenuti su display virtuali non di sistema.
Sfondi
In Android 10 (e versioni successive) sono supportati gli sfondi sui display secondari:
Figura 2. Sfondo animato per elementi interni (sopra) ed esterni visualizza (sotto)
Gli sviluppatori possono dichiarare il supporto della funzionalità sfondo fornendo
android:supportsMultipleDisplays="true"
in
Definizione XML WallpaperInfo
. Inoltre, gli sviluppatori di sfondi
si prevede che caricherà gli asset utilizzando il contesto di visualizzazione
WallpaperService.Engine#getDisplayContext()
.
Il framework crea un'istanza WallpaperService.Engine
per display, in modo che ogni motore abbia una piattaforma e un contesto di visualizzazione specifici. La
sviluppatore deve assicurarsi che ogni motore possa disegnare in modo indipendente,
diverse frequenze fotogrammi, rispettando VSYNC.
Selezionare gli sfondi per le singole schermate
Android 10 non offre un supporto diretto della piattaforma per la selezione degli sfondi
per i singoli schermi. A questo scopo, viene usato un identificatore display stabile
necessarie per mantenere le impostazioni dello sfondo per ogni display.
Display#getDisplayId()
è dinamico, quindi non c'è garanzia che un
il display fisico avrà lo stesso ID dopo il riavvio.
Tuttavia, Android 10 ha aggiunto DisplayInfo.mAddress
,
che contiene identificatori stabili per i display fisici e può essere utilizzato per un
implementazione in futuro. Purtroppo è troppo tardi per implementare la logica
per Android 10. La soluzione suggerita:
- Utilizza l'API
WallpaperManager
per impostare gli sfondi. WallpaperManager
è ottenuto da unContext
e ogni oggettoContext
contiene informazioni sull'oggetto display (Context#getDisplay()/getDisplayId()
). Pertanto, puoi ottienidisplayId
da un'istanzaWallpaperManager
senza aggiungere nuovi metodi.- Sul lato del framework, usa
displayId
ottenuto da unContext
e mappalo a un identificatore statico (come una porta di un display fisico). Utilizza l'identificatore statico per mantenere lo sfondo scelto.
Questa soluzione alternativa utilizza le implementazioni esistenti per i selettori di sfondi. Se è stata aperta su un display specifico e usa il giusto contesto, per impostare uno sfondo, il sistema può identificare automaticamente il display.
Se serve impostare lo sfondo per un display diverso da quello attuale
display, quindi crea un nuovo oggetto Context
per la visualizzazione target
(Context#createDisplayContext
) e ottieni
WallpaperManager
istanza da quel display.
Limitazioni di sicurezza
Il sistema non mostrerà sfondi virtuali che non sono di sua proprietà. Ciò è dovuto a un problema di sicurezza secondo cui un'app dannosa potrebbe creare un'istanza display con le decorazioni di sistema attive supporta e legge una risposta informazioni dalla piattaforma (come una foto personale).
Implementazione
In Android 10, IWallpaperConnection#attachEngine()
e IWallpaperService#attach()
accettano i
displayId
per creare connessioni per display.
WallpaperManagerService.DisplayConnector
incapsula un singolo display
motore dello sfondo e connessione. In WindowManager, i controller dello sfondo vengono
creato per ogni oggetto DisplayContent
in fase di costruzione, invece di una
WallpaperController
singolo per tutti i display.
Alcune implementazioni pubbliche del metodo WallpaperManager
(ad esempio
WallpaperManager#getDesiredMinimumWidth()
) sono stati aggiornati per eseguire il calcolo
e fornire informazioni per i display corrispondenti.
WallpaperInfo#supportsMultipleDisplays()
e un valore corrispondente
è stato aggiunto l'attributo resource, in modo che gli sviluppatori di app possano segnalare
sono pronti per più schermi.
Se il servizio di sfondi mostrato sul display predefinito non supporta più display, il sistema mostra lo sfondo predefinito sui vengono visualizzati i video.
Figura 3. Logica di fallback dello sfondo per i display secondari