Modalità finestra a forma libera di Android Nougat: cos'è e come possono utilizzarla gli sviluppatori

La modalità multi-finestra a forma libera è una funzionalità sottoutilizzata e sottovalutata in Android Nougat. Spieghiamo cos'è e come gli sviluppatori possono incorporarlo.

Modalità finestra a forma libera, come dimostrato per la prima volta da Ars Tecnica

Quando Android 7.0 Nougat fu annunciato per la prima volta all'inizio del 2016, portò con sé una funzionalità molto richiesta sulla piattaforma Android: il supporto multi-finestra. La maggior parte delle persone è a conoscenza del supporto multi-finestra a schermo diviso abilitato per impostazione predefinita su tutti i telefoni e tablet Android Nougat. I dispositivi Android TV con Android Nougat sono dotati del supporto per più finestre Picture-in-Picture.

Tuttavia, in Android Nougat è presente una terza modalità multi-finestra di cui non molte persone sono a conoscenza: modalità finestra a forma libera. Questa modalità consente ad Android di presentare le app come finestre mobili che possono essere spostate e ridimensionate a piacimento dall'utente. È essenzialmente l'implementazione di Android di a

gestore di finestre di impilamento.

Nel Documentazione dell'SDK Android, si precisa che:

I produttori di dispositivi più grandi possono scegliere di abilitare la modalità a mano libera, in cui l'utente può ridimensionare liberamente ciascuna attività. Se il produttore abilita questa funzione, il dispositivo offre la modalità a mano libera oltre alla modalità a schermo diviso.

E inoltre, nel CDD di Android 7.0:

Le implementazioni del dispositivo con dimensioni dello schermo xlarge DOVREBBERO supportare la modalità a forma libera.

Ciò indica che qualsiasi nuovo dispositivo Android con schermo di grandi dimensioni fornito con Android 7.0 potrebbe potenzialmente avere la modalità finestra a forma libera abilitata dal produttore.

Tuttavia, questo non è assolutamente un requisito difficile. È possibile forzare Qualunque Dispositivo Android Nougat (con opzioni sviluppatore abilitate) per supportare la modalità finestra a mano libera utilizzando uno dei due metodi diversi:


Abilitazione della modalità finestra a mano libera su qualsiasi dispositivo Android Nougat

L'attivazione dell'opzione "Forza attività ridimensionabili" consente alle app di essere eseguite in modalità a mano libera su qualsiasi dispositivo

Metodo 1 (è richiesto un computer con adb)

Assicurati che il debug USB sia abilitato nelle Opzioni sviluppatore. Quindi, collega il tuo dispositivo a un computer con adb installato ed esegui il seguente comando:

adb shell settings put global enable_freeform_support 1

Metodo 2 (nessun requisito aggiuntivo)

Abilita l'opzione "Forza attività ridimensionabili" nella parte inferiore delle Opzioni sviluppatore.

Entrambi questi metodi richiedono il riavvio dell'interfaccia utente del sistema prima che possano avere effetto. Il modo più semplice per farlo è riavviare il dispositivo (o, se il dispositivo è rootato, puoi semplicemente uccidere il file com.android.systemui processi)


OK, quindi la modalità a mano libera è abilitata... e adesso?

Se hai abilitato la modalità a mano libera utilizzando il Metodo 1, sarà presente un nuovo pulsante nelle voci dell'app nel menu Panoramica per avviare un'app in modalità finestra a mano libera.

Con il Metodo 2, tuttavia, non è possibile avviare un'app in modalità libera tramite Android stesso. Fortunatamente, è possibile per qualsiasi launcher di terze parti avviare un'app in modalità finestra a mano libera utilizzando API Android standard finalizzate come parte del livello API 24.

La chiave per avviare un'app in modalità a mano libera è chiamare il file ActivityOptions.setLaunchBounds() metodo. Questo metodo richiede a Rect come argomento, contenente i limiti della finestra con cui verrà avviata l'app.

È quindi possibile avviare l'app con startActivity(Intent, Bundle). Se non hai già un ActivityOptions bundle, puoi crearne uno con ActivityOptions.makeBasic() e poi chiamare setLaunchBounds() sul bundle appena creato.

Tieni presente che per impostazione predefinita, se è già presente un'attività per l'app nella schermata Panoramica, allora Android ti reindirizzerà semplicemente all'attività esistente (a schermo intero) precedentemente avviata da utente. Sarà necessario cancellare tutte le attività per l'app in Panoramica prima di tentare di avviare l'app in una finestra a forma libera. (Per le app con attività avviate in standard O singleTop modalità, puoi forzare l'apertura di una nuova finestra aggiungendo il file Intent.FLAG_ACTIVITY_MULTIPLE_TASK contrassegnare l'intento prima di chiamare startActivity().)


Come funziona la modalità a mano libera?

C'è un articolo eccellente scritto che spiega come viene implementata la modalità multi-finestra, inclusa la modalità a mano libera, in Android Nougat. (NOTA: l'articolo è scritto in cinese, quindi assicurati di eseguirlo tramite Google Translate)

In poche parole, le app in modalità a mano libera vengono eseguite in uno stack separato dal resto del sistema (si pensi al desktop virtuale). Pertanto, non è possibile eseguire app in formato libero sopra il programma di avvio o sopra un'altra app a schermo intero.

App in esecuzione in modalità a mano libera (che non dispongono di android: windowIsFloating impostato su true) hanno a DecorCaptionView aggiunto come figlio del livello superiore DecorView. Questa vista contiene a LinearLayout definendo la barra del titolo della finestra per spostare, ingrandire e chiudere la finestra. Anche se non lo consiglio personalmente, è possibile accedere e personalizzare questa visualizzazione ottenendo il file DecorView utilizzando Window.getDecorView(), trasformandolo in a ViewGroup e quindi accedendo alle sue visualizzazioni secondarie.

Qualsiasi app progettata per comportarsi bene nella modalità multi-finestra a schermo diviso standard di Android funzionerà in modalità a mano libera. isInMultiWindowMode() restituirà true per le app eseguite in modalità a mano libera. Esistono alcune altre classi e metodi disponibili pubblicamente che un'app può utilizzare e che si riferiscono specificamente alla modalità a mano libera:

  • Window.setDecorCaptionShade(): questo metodo può essere utilizzato per sovrascrivere l'ombreggiatura dei controlli della didascalia (il pulsante di ingrandimento e chiusura) per le app in modalità a mano libera.
  • Window.setRestrictedCaptionAreaListener(): può essere utilizzato per rilevare quando una finestra viene spostata in modalità a mano libera. IL Window.OnRectrictedCaptionAreaChangedListener viene chiamato ogni volta che cambia la posizione dei controlli della didascalia (quando un utente sposta la finestra) e fornisce a Rect con i nuovi limiti dei controlli didascalia.
  • ActivityInfo.WindowLayout: questa classe contiene le informazioni dichiarate nel manifest dell'app relative al posizionamento iniziale di una finestra a forma libera che un'app può richiedere all'avvio. Ad esempio, puoi elencare quanto segue nel file tag del tuo manifest:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Quindi, quando il dispositivo è già in modalità a forma libera e l'app viene avviata, verrà avviata con questi limiti specificati.

Esempi di modalità finestra a forma libera in azione

La barra delle applicazioni aggiunge un menu di avvio e una barra delle applicazioni recenti per completare la modalità finestra a forma libera

Nell'estate del 2016, mentre Android Nougat era ancora un'anteprima per sviluppatori, ho rilasciato un'app chiamata Barra delle applicazioni che fornisce un menu di avvio simile a Windows e un elenco di app recenti in una sovrapposizione di sistema. Consente agli utenti di Nougat di avviare app in modalità finestra a mano libera e, poiché la barra delle applicazioni utilizza una sovrapposizione, può rimanere sullo schermo nell'ambiente a finestra a mano libera. La combinazione della barra delle applicazioni e della modalità a forma libera conferisce a qualsiasi dispositivo Android, in particolare ai tablet, un aspetto simile a quello di un PC.

Puoi scarica la barra delle applicazioni su Google Play, o visualizzare il codice sorgente te stesso su GitHub. Oltre ai concetti menzionati in questo articolo, utilizzo anche alcuni trucchi per mantenere attivo l'ambiente in modalità a mano libera anche quando sullo schermo non vengono visualizzate finestre a mano libera. Gli utenti possono anche facoltativamente impostare la barra delle applicazioni come launcher predefinito per consentire al proprio dispositivo di avviarsi automaticamente nell'ambiente in modalità libera.

Poiché non esistono dispositivi forniti ufficialmente con il supporto per finestre a forma libera abilitato dall'OEM (al momento della stesura di questo articolo), lo consiglio utilizzando la barra delle applicazioni come strumento per gli sviluppatori per testare le proprie app nell'ambiente di finestre a forma libera su dispositivi che altrimenti non supportano Esso.

Oltre alla barra delle applicazioni, ho anche modificato il codice sorgente Launcher3 di AOSP per consentirgli di avviare app in modalità a mano libera. Questo è un clone diretto del launcher Android 7.1.1 di serie, con le modifiche minime necessarie per consentirgli di avviare app in formato libero. Ho fornito questo launcher modificato nella speranza che altri sviluppatori implementino il supporto per l'avvio di finestre a forma libera nei loro launcher personalizzati. Puoi visualizzare il codice sorgente su GitHub, o scarica un APK di esempio.

La mia speranza è che gli sviluppatori di launcher personalizzati possano utilizzare questo codice e abilitare il supporto per il lancio in forma libera app per finestre per quegli utenti che desiderano una maggiore flessibilità per la gestione delle finestre sul proprio schermo di grandi dimensioni dispositivi.