I display connessi estendono l'esperienza di finestre delle app agli smartphone standard, consentendo agli utenti di accedere a schermi di grandi dimensioni dai propri dispositivi mobili. Questa funzionalità apre nuove possibilità per l'interazione con le app e la produttività degli utenti.
Tutte le funzionalità uniche delle finestre delle app si applicano ai display collegati. Quando colleghi uno smartphone a un display, lo stato dello smartphone rimane invariato e sul display connesso viene avviata una sessione desktop vuota. Il dispositivo e il display fungono da due sistemi individuali, con app specifiche per ogni display.
Se colleghi un dispositivo con finestre delle app, come un tablet, a un monitor esterno, la sessione desktop si estende su entrambi i display. I due display funzionano quindi come un unico sistema continuo. Questa configurazione consente a finestre, contenuti e cursore di spostarsi liberamente tra i due display.
Il supporto efficace dei display connessi richiede attenzione a diversi aspetti della progettazione e dell'implementazione dell'app. Le seguenti best practice garantiscono un'esperienza utente fluida e produttiva.
Gestire le modifiche alla visualizzazione dinamica
Molte app sono create presupponendo che l'oggetto Display e le sue caratteristiche non cambieranno durante il ciclo di vita dell'app. Tuttavia, quando un utente
collega o scollega un monitor esterno o sposta una finestra dell'app tra
i display, l'oggetto Display sottostante associato al contesto o alla
finestra dell'app può cambiare. Le proprietà del display, come dimensioni, risoluzione, frequenza di aggiornamento, supporto HDR e densità, possono essere diverse. Se codifichi i valori in base allo schermo dello smartphone, ad esempio, i layout probabilmente non funzioneranno su un display esterno.
Anche i display esterni possono avere densità di pixel molto diverse. Devi assicurarti che la tua app risponda correttamente alle modifiche della densità. Ciò comporta l'utilizzo di pixel indipendenti dalla densità (dp) per i layout, la fornitura di risorse specifiche per la densità e la garanzia che la UI venga scalata in modo appropriato.
Se un'attività è in esecuzione su un display esterno quando questo viene disconnesso, il sistema la sposta sul display principale. Lo spostamento attiva modifiche alla configurazione, ad esempio modifiche alle dimensioni e alla densità dello schermo, che possono causare la ricreazione dell'attività. La tua app deve gestire la modifica della configurazione salvando e ripristinando lo stato della UI per evitare la perdita di dati o un'esperienza utente confusa.
Utilizzare il contesto giusto
L'utilizzo del contesto giusto è fondamentale negli ambienti multi-display. Quando si accede alle risorse, il contesto dell'attività (visualizzato) è diverso dal contesto dell'applicazione (non visualizzato).
Il contesto dell'attività contiene informazioni sul display e viene sempre regolato per l'area di visualizzazione in cui viene visualizzata l'attività. In questo modo puoi ottenere le informazioni corrette sulla densità di visualizzazione o sulle metriche della finestra della tua app. Utilizza sempre il contesto dell'attività (o un altro contesto basato sulla UI) per ottenere informazioni sulla finestra o sul display corrente. Ciò influisce anche su alcune API di sistema che utilizzano informazioni dal contesto.
In Jetpack Compose, puoi accedere a informazioni specifiche del display utilizzando
oggetti CompositionLocal come LocalConfiguration.current e
LocalDensity.current. Quando un'attività o una finestra si sposta tra i display,
la configurazione del dispositivo cambia, attivando la ricomposizione con nuove metriche
del display. Gli oggetti CompositionLocal consentono alla tua UI di adattarsi perfettamente.
Ottenere informazioni sul display
Puoi utilizzare la classe Display per ottenere informazioni quali dimensioni di visualizzazione,
densità o flag. Utilizza il servizio di sistema DisplayManager per ottenere i
display disponibili. Per identificare i display esterni, filtra
Display.DEFAULT_DISPLAY, che in genere è lo schermo
integrato dello smartphone o del tablet:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays() // The default display is 0. External displays have other IDs. val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
Gestire l'avvio e la configurazione delle attività
Con i display connessi, le app possono specificare su quale display deve essere eseguita un'app quando viene avviata o quando crea un'altra attività. Questo comportamento dipende dalla modalità di avvio dell'attività definita nel file manifest e dai flag e dalle opzioni dell'intent impostati dall'entità che avvia l'attività.
Quando un'attività viene spostata su un display secondario, l'app può subire un aggiornamento del contesto, un ridimensionamento della finestra e modifiche alla configurazione e alle risorse. Se l'attività
gestisce la modifica alla configurazione, viene notificata in
onConfigurationChanged(). In caso contrario, l'attività viene riavviata.
Se la modalità di avvio selezionata per un'attività consente più istanze, l'avvio su uno schermo secondario può creare una nuova istanza dell'attività. Entrambe le attività vengono riprese contemporaneamente, il che può essere utile in determinati scenari di multitasking.
Puoi avviare un'attività su un determinato display utilizzando ActivityOptions.
Tieni presente che launchDisplayId richiede Android 8 (livello API 26) o versioni successive.
// Get DisplayManager and find the first external display. val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val externalDisplayId = displayManager.displays .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY } ?.displayId // If an external display is found, launch the activity on it. if (externalDisplayId != null) { val intent = Intent(this, MySecondaryActivity::class.java) val options = ActivityOptions.makeBasic() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { options.launchDisplayId = externalDisplayId } startActivity(intent, options.toBundle()) } else { // Optionally, handle the case where no external display is connected. }
Evitare le liste consentite dei dispositivi
A volte le app limitano l'interfaccia utente e le funzionalità per schermi di grandi dimensioni a determinati dispositivi tramite
una lista consentita o controllando BUILD.MODEL e le dimensioni di visualizzazione integrate.
Questo approccio non è efficace per i display connessi perché praticamente qualsiasi
dispositivo può essere collegato a uno schermo di grandi dimensioni e il modello del dispositivo non cambia
quando viene collegato un display esterno.
Anziché utilizzare le liste consentite o controllare BUILD.MODEL e le dimensioni
di visualizzazione integrate, controlla le metriche della finestra o le funzionalità del dispositivo in fase di runtime per prendere decisioni
relative all'interfaccia utente. Utilizza le API Jetpack WindowManager o le classi di dimensioni della finestra per
creare layout adattabili e reattivi per varie dimensioni e densità dello schermo.
Supportare periferiche esterne
Quando gli utenti si connettono a un display esterno, spesso creano un ambiente più simile a un computer desktop. Spesso ciò comporta l'utilizzo di tastiere, mouse, trackpad, webcam, microfoni e altoparlanti esterni. Devi assicurarti che la tua app funzioni perfettamente con queste periferiche. Ciò include la gestione delle scorciatoie da tastiera, la gestione delle interazioni del puntatore del mouse, il supporto corretto di videocamere o microfoni esterni e il rispetto del routing dell'uscita audio. Per maggiori dettagli, vedi Compatibilità dell'input su schermi di grandi dimensioni.
Migliorare la produttività degli utenti
I display connessi offrono un'opportunità significativa per migliorare la produttività degli utenti. Ora hai gli strumenti per creare app mobile in grado di offrire esperienze paragonabili alle applicazioni desktop. Valuta la possibilità di implementare le seguenti funzionalità per aumentare la produttività degli utenti:
- Consente agli utenti di aprire più istanze della stessa app. Questa funzionalità è preziosa per attività come il confronto di documenti, la gestione di conversazioni diverse o la visualizzazione simultanea di più file.
- Consenti agli utenti di condividere informazioni aggiuntive all'interno e all'esterno della tua app con il trascinamento e rilascio.
- Aiuta gli utenti a mantenere il flusso di lavoro durante le modifiche alla configurazione implementando un solido sistema di gestione dello stato.
Seguendo queste linee guida e utilizzando gli esempi di codice forniti, puoi creare app che si adattano perfettamente ai display connessi, offrendo agli utenti un'esperienza più ricca e produttiva.