Multi-finestra in Android N: cosa devono sapere gli sviluppatori per sfruttarlo al meglio

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.

N introduce tre diverse modalità multi-finestra:
  • 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.
Modalità schermo diviso Android NModalità PiP Android N
Vale la pena notarlo. abbiamo già trattato la multifinestra su N e abbiamo avanzato alcune critiche al sistema attuale. Con questo in mente, speriamo che la modalità a mano libera si avvicini un po' alla modalità immagine nell'immagine, poiché avrebbe applicazioni utili su tutti i dispositivi.
Abilitare il supporto multi-finestra nelle tue app è semplice: non devi fare nulla se hai già scelto come target N. Se scegli di disabilitare la multi-finestra, puoi farlo impostando il. 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)
Puoi trovare un esempio di codice in. App di esempio Multi-Window Playground di Google su GitHub: AndroidManifest.xml.
Con l'introduzione del supporto multi-finestra, potresti dover ricontrollare alcune cose nelle tue app per assicurarti che funzionino correttamente.

Comprendere il ciclo di vita dell'attività

IL. ciclo di vita dell'attività rimane invariato in modalità multi-finestra: Ciclo di vita di base dell'attività Android 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.
Sono stati aggiunti nuovi callback per eventi multi-finestra, nonché metodi per interrogare lo stato corrente.
  • 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.
PS. Eccetto per. 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: usa MediaSession#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.
Per esempi di codice, consulta l'app di esempio Multi-Window Playground: esempio di attività adiacente, esempio dei limiti di lancio.

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 O View#DRAG_FLAG_GLOBAL_URI_WRITE, a seconda dei casi.
  • 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(), utilizzando PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT E PackageManager#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. Se android: windowBackground non è impostato, android: windowBackgroundFallback viene utilizzato invece. Per un esempio, fare riferimento all'app di esempio Multi-Window Playground.
Wale ha offerto alcune best practice per garantire che i tuoi utenti abbiano la migliore esperienza possibile:
  • 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.
Wale ha concluso la sessione offrendo alcune risorse utili aggiuntive:
  • Documentazione multi-finestra.
  • Linee guida per la progettazione dei materiali per la modalità schermo diviso.
  • Esempio di app multi-finestra.