Forniamo una panoramica di cosa significherà per gli sviluppatori il prossimo supporto multi-finestra in Android N e come trarne il meglio!
Il supporto multi-finestra è una funzionalità interessante che stiamo aspettando in Android N e uno che volevamo fosse disponibile su tutti i dispositivi da molto tempo. Affinché sia un'esperienza piacevole, tuttavia, gli sviluppatori potrebbero dover apportare alcune modifiche alle loro app per supportarla correttamente.
Una delle sessioni I/O di Google è stata dedicata agli sviluppatori per conoscere le nuove API e i cambiamenti comportamentali del sistema apportati dal supporto multifinestra.
La sessione è stata presentata da Wale Ogunwale, Technical Lead Manager per Android ActivityManager e Componenti del framework WindowManager: lui e il suo team sono i responsabili del multi-finestra su Android.
Puoi guardare il Sessione in modalità multi-finestra su YouTube, ma forniamo anche una panoramica della sessione qui.
- Modalità schermo diviso: questa è la modalità disponibile per impostazione predefinita. Come suggerisce il nome, ti consente di aprire due applicazioni affiancate.
- Modalità a forma libera: i produttori possono abilitarla su dispositivi più grandi, consentendo agli utenti di ridimensionare liberamente le attività oltre alla modalità schermo diviso.
- Modalità immagine nell'immagine: rivolta ai dispositivi Android TV, questa modalità è destinata all'esecuzione dei lettori video in una finestra bloccata mentre l'utente interagisce con altre applicazioni.
android: resizeableActivity
attributo di attività nel tuo manifest a. false
. Questo dovrebbe essere fatto solo se veramente giustificato, poiché fa sempre risaltare la tua app in modo negativo avvio in modalità a schermo intero anche se l'utente (o un'altra app) tenta di avviarlo in più finestre modalità. È importante notare che gli attributi di un'attività root si applicano a tutte le attività all'interno del suo stack di attività. In altre parole, se hai un'attività che può essere avviata da altre app, assicurati che supporti la modalità multi-finestra poiché non puoi garantire che altre app avvieranno la tua attività in una nuova attività utilizzando. Intent#FLAG_ACTIVITY_NEW_TASK
Il supporto della modalità Picture-in-picture deve essere dichiarato esplicitamente tramite il file. android: supportsPictureInPicture
attributo. Tieni presente che questo attributo viene ignorato if. android: resizeableActivity
È. false
Gli attributi .Layout possono essere utilizzati per impostare dimensioni e posizionamento predefiniti per le finestre a forma libera o per specificare una larghezza o altezza minima sia per le modalità a forma libera che a schermo diviso: -
android: defaultWidth
/android: defaultHeight
: le dimensioni predefinite dell'attività (modalità a mano libera). -
android: gravity
: la posizione iniziale dell'attività (modalità a mano libera). -
android: minimalWidth
/android: minimalHeight
: le dimensioni minime dell'attività (modalità a mano libera e schermo diviso)
Comprendere il ciclo di vita dell'attività
IL. ciclo di vita dell'attività rimane invariato in modalità multi-finestra: Detto questo, alcune sottili differenze tra gli stati di attività potrebbero provocare comportamenti involontari che normalmente non noteresti prima di N. È importante saperlo.Activity#onResume()
E. Activity#onPause()
vengono chiamati quando l'app ottiene o perde il focus, ma non necessariamente quando inizia o smette di essere visibile. (Ricorda che solo un'app può essere attiva in un dato momento.) Per le app che aggiornano costantemente i contenuti (ad esempio la riproduzione video), assicurati di gestire l'avvio e l'interruzione degli aggiornamenti dei contenuti in. Activity#onStart()
E. Activity#onStop()
Invece. Non farlo per le app video, ad esempio, significherà che la riproduzione avverrà solo se l'app è focalizzata, che vanifica lo scopo della modalità multi-finestra. L'app YouTube ufficiale ha riscontrato un problema simile quando è stata lanciata per la prima volta l'anteprima per sviluppatori di Android N. Gestione delle modifiche di runtime
Quando un'app viene messa in modalità multi-finestra, alcune configurazioni del dispositivo cambieranno. Puoi consentire il riavvio della tua attività (nel qual caso. conservando i frammenti potrebbe essere una buona idea, se la tua attività deve eseguire un'operazione intensiva all'avvio), oppure scegli di farlo. gestire le modifiche alla configurazione in modo esplicito Invece. Quattro configurazioni del dispositivo possono cambiare quando si accede o all'interno della modalità multi-finestra:screenSize
, smallestScreenSize
, screenLayout
E. orientation
. Fare riferimento al. Documentazione per sviluppatori Android per maggiori informazioni su ciascun attributo, ma tienilo presente. orientation
non si riferisce più all'orientamento del dispositivo in questo caso. Invece, indica semplicemente se la larghezza della tua attività è maggiore della sua altezza (orizzontale) o not (ritratto). Puoi dichiarare che la tua attività gestirà queste modifiche dal manifest: android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Tieni presente che ciò significa che dovrai effettivamente gestire queste modifiche. Activity#onConfigurationChanged()
, aggiornando manualmente le viste o ricaricando alcune risorse. Funzionalità disabilitate in modalità multi-finestra
Alcune funzionalità del sistema non saranno influenzate dalle tue attività in modalità multi-finestra:- Le modifiche alla barra di stato e alla barra di navigazione, come oscurare/nascondere le barre di sistema o utilizzare la modalità immersiva, non avranno alcun effetto. Ciò ha senso poiché la tua attività occupa solo una parte dello schermo.
- IL
android: screenOrientation
Anche l'attributo attività non ha alcun effetto in modalità multi-finestra: poiché la tua attività sarà ridimensionabile, non ha più senso che abbia un orientamento fisso.
-
Activity#onMultiWindowModeChanged(boolean inMultiWindow)
: chiamato quando lo stato dell'attività cambia da schermo intero a multi-finestra e viceversa. -
Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture)
: chiamato quando lo stato dell'attività passa alla/dalla modalità PIP. -
Activity#isInMultiWindowMode()
/Activity#isInPictureInPictureMode()
: indica se l'attività è in modalità multi-finestra/immagine nell'immagine o meno. -
Activity#overlayWithDecorCaption(boolean overlay)
: per le finestre a forma libera, questo metodo può essere utilizzato per fare in modo che la didascalia (la barra utilizzata per trascinare la finestra) si sovrapponga al contenuto invece di spingerlo verso il basso.
Activity#overlayWithDecorCaption()
, questi metodi sono forniti anche dal. Fragment
classe. Avvio delle attività in modalità multi-finestra
-
Activity#enterPictureInPictureMode()
può essere utilizzato per mettere un'attività in modalità immagine nell'immagine. Tieni presente che le attività in modalità PiP non ricevono notifiche sugli eventi di input: usaMediaSession#setMediaButtonReceiver()
se vuoi gestire tali eventi. Assicurati inoltre di controllare il sito Web degli sviluppatori Android se sei interessato Picture-in-picture su Android N.
- Se il dispositivo è in modalità schermo diviso, puoi dire al sistema di avviare un'altra attività accanto alla tua utilizzando il
Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
bandiera. Il flag non ha effetto se non in modalità schermo diviso. - Se il dispositivo è in modalità a mano libera,
ActivityOptions#setLaunchBounds()
può essere utilizzato per specificare le dimensioni e la posizione della nuova attività sullo schermo.
Trascinare e rilasciare
Sebbene il supporto del trascinamento della selezione sia disponibile sin dai tempi di Honeycomb, in precedenza era possibile solo all'interno della stessa attività. Nevica. supportato in multi-finestra anche. L'implementazione di questo sembra essere. per lo più uguale a prima, con alcune aggiunte per il trascinamento della selezione di attività incrociate:View#startDragAndDrop()
- Nuovo alias per
View#startDrag()
. - Per abilitare il trascinamento della selezione delle attività incrociate, passa il nuovo flag
View#DRAG_FLAG_GLOBAL
. - Se è necessario fornire autorizzazioni URI all'attività del destinatario, passare i nuovi flag
View#DRAG_FLAG_GLOBAL_URI_READ
OView#DRAG_FLAG_GLOBAL_URI_WRITE
, a seconda dei casi.
- Nuovo alias per
View#updateDragShadow()
- Sostituisce l'ombra di trascinamento per un'operazione di trascinamento attualmente in corso. Può essere chiamato solo dall'app che ha originato l'operazione di trascinamento.
View#cancelDragAndDrop()
- Annulla un'operazione di trascinamento attualmente in corso. Può essere chiamato solo dall'app che ha originato l'operazione di trascinamento.
- È possibile verificare se un dispositivo supporta le modalità a mano libera o immagine nell'immagine tramite
PackageManager#hasSystemFeature()
, utilizzandoPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
EPackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE
rispettivamente.
- IL
android: windowBackground
l'attributo può essere utilizzato come sfondo disegnabile, se l'attività viene ridimensionata e il suo rendering è in ritardo. Seandroid: windowBackground
non è impostato,android: windowBackgroundFallback
viene utilizzato invece. Per un esempio, fare riferimento all'app di esempio Multi-Window Playground.
- La modalità di gestione cambia elegantemente:
- Mantieni la coerenza dell'interfaccia utente indipendentemente dall'orientamento. Non fare in modo che gli elementi cambino posizione per consentire transizioni fluide.
- Ampliando quanto sopra, non passare da layout molto diversi per i layout di telefono/tablet. Adatta invece il layout del tablet a dimensioni più piccole per coerenza.
- Assicurati che le tue attività si adattino alle piccole dimensioni di seguendo i modelli del Material Design.
- Utilizzo
FLAG_ACTIVITY_LAUNCH_ADJACENT
quando ha senso rendere l'esperienza più piacevole in modalità schermo diviso. - Dichiarare l'incompatibilità del ridimensionamento solo quando giustificato. Come abbiamo discusso in precedenza, altrimenti fa risaltare la tua app in modo negativo.
- Documentazione multi-finestra.
- Linee guida per la progettazione dei materiali per la modalità schermo diviso.
- Esempio di app multi-finestra.