Modul fereastră cu formă liberă pentru Android Nougat: ce este și cum îl pot utiliza dezvoltatorii

Modul cu mai multe ferestre cu formă liberă este o caracteristică subutilizată și subapreciată în Android Nougat. Vă explicăm ce este și cum îl pot încorpora dezvoltatorii.

Modul fereastră cu formă liberă, așa cum a demonstrat prima dată de Ars Technica

Când Android 7.0 Nougat a fost anunțat pentru prima dată la începutul anului 2016, a adus cu el o funcție foarte solicitată platformei Android - suport pentru mai multe ferestre. Majoritatea oamenilor sunt conștienți de suportul pentru ferestre multiple cu ecran divizat activat în mod implicit pe toate telefoanele și tabletele Android Nougat. Dispozitivele Android TV cu Android Nougat vin cu suport pentru suport pentru mai multe ferestre imagine în imagine.

Cu toate acestea, există un al treilea mod cu mai multe ferestre prezent în Android Nougat de care nu foarte mulți oameni sunt conștienți: modul fereastră cu formă liberă. Acest mod permite Android să prezinte aplicațiile ca ferestre plutitoare care pot fi mutate și redimensionate după bunul plac de către utilizator. Este, în esență, implementarea de către Android a unui

manager de ferestre de stivuire.

În Documentație Android SDK, se precizează că:

Producătorii de dispozitive mai mari pot alege să activeze modul freeform, în care utilizatorul poate redimensiona liber fiecare activitate. Dacă producătorul activează această caracteristică, dispozitivul oferă mod liber pe lângă modul ecran divizat.

Și, de asemenea, în Android 7.0 CDD:

Implementările dispozitivelor cu dimensiunea ecranului xlarge TREBUIE să accepte modul liber.

Acest lucru indică faptul că orice dispozitiv Android nou cu ecran mare care este livrat cu Android 7.0 ar putea avea modul fereastră cu formă liberă activat de producător.

Cu toate acestea, aceasta nu este absolut o cerință grea. Este posibil să forțați orice Dispozitiv Android Nougat (cu opțiunile de dezvoltator activate) pentru a accepta modul fereastră cu formă liberă folosind una dintre două metode diferite:


Activarea modului fereastră cu formă liberă pe orice dispozitiv Android Nougat

Activarea opțiunii „Forțați activitățile să fie redimensionabile” permite aplicațiilor să ruleze în modul liber pe orice dispozitiv

Metoda 1 (este necesar un computer cu adb)

Asigurați-vă că Depanarea USB este activată în Opțiuni pentru dezvoltatori. Apoi, conectați dispozitivul la un computer cu adb instalat și executați următoarea comandă:

adb shell settings put global enable_freeform_support 1

Metoda 2 (fără cerințe suplimentare)

Activați opțiunea „Forțați activitățile să fie redimensionate” din partea de jos a Opțiunilor pentru dezvoltatori.

Ambele metode necesită repornirea interfeței de utilizare a sistemului înainte ca acestea să intre în vigoare. Cel mai simplu mod de a face acest lucru este să reporniți dispozitivul (sau, dacă dispozitivul este rootat, puteți pur și simplu să omorâți com.android.systemui proces)


OK, deci modul liber este activat... acum ce?

Dacă ați activat modul liber folosind metoda 1, atunci va apărea un buton nou pe intrările aplicației din meniul Prezentare generală pentru a lansa o aplicație în modul fereastră cu formă liberă.

Cu Metoda 2, totuși, nu este posibil să lansați o aplicație în modul liber prin Android în sine. Din fericire, este posibil ca orice lansator terță parte să lanseze o aplicație în modul fereastră liberă folosind API-uri Android standard care au fost finalizate ca parte a nivelului API 24.

Cheia pentru lansarea unei aplicații în modul liber este să apelați ActivityOptions.setLaunchBounds() metodă. Această metodă necesită a Rect ca argument, care conține limitele ferestrei cu care se va lansa aplicația.

Apoi puteți porni aplicația cu startActivity(Intent, Bundle). Dacă nu aveți deja un ActivityOptions pachet, puteți crea unul cu ActivityOptions.makeBasic() și apoi sunând setLaunchBounds() pe pachetul proaspăt creat.

Rețineți că, în mod implicit, dacă există deja o sarcină pentru aplicație prezentă în ecranul Prezentare generală, atunci Android vă va redirecționa pur și simplu către sarcina existentă (în ecran complet) care a fost lansată anterior de către utilizator. Va trebui să ștergeți toate sarcinile pentru aplicație în Prezentare generală înainte de a încerca să lansați aplicația într-o fereastră cu formă liberă. (Pentru aplicațiile cu activități care se lansează în standard sau singleTop moduri, puteți forța deschiderea unei ferestre noi adăugând Intent.FLAG_ACTIVITY_MULTIPLE_TASK semnalați intenția înainte de a apela startActivity().)


Cum funcționează modul freeform sub capotă?

Există un articol excelent scris care explică modul în care modul cu mai multe ferestre, inclusiv modul liber, este implementat în Android Nougat. (NOTĂ: articolul este scris în chineză, așa că asigurați-vă că îl rulați prin Google Translate)

Pe scurt, aplicațiile în modul freeform rulează într-o stivă separată de restul sistemului (gândiți-vă: desktop virtual). Prin urmare, nu este posibil ca aplicațiile cu formă liberă să ruleze deasupra lansatorului sau deasupra altei aplicații pe ecran complet.

Aplicații care rulează în modul liber (care nu au android: windowIsFloating setat la adevărat) au a DecorCaptionView adăugat ca un copil al nivelului superior DecorView. Această vedere conține o LinearLayout definirea barei de legendă a ferestrei pentru mutarea, maximizarea și închiderea ferestrei. Deși nu o recomand personal, este posibil să accesați și să personalizați această vizualizare prin obținerea DecorView folosind Window.getDecorView(), turnându-l la a ViewGroup și apoi accesând vizualizările sale secundare.

Orice aplicație care este proiectată să se comporte bine în modul standard cu ferestre multiple cu ecran împărțit al Android va funcționa în modul liber. isInMultiWindowMode() va returna true pentru aplicațiile care rulează în modul liber. Există alte câteva clase și metode disponibile public pe care o aplicație le poate folosi și care se referă în mod specific la modul liber:

  • Window.setDecorCaptionShade(): această metodă poate fi folosită pentru a suprascrie nuanța comenzilor subtitrării (butonul de maximizare și de închidere) pentru aplicațiile în modul liber.
  • Window.setRestrictedCaptionAreaListener(): poate fi folosit pentru a detecta când o fereastră este mutată în modul liber. The Window.OnRectrictedCaptionAreaChangedListener este apelat de fiecare dată când se modifică poziția comenzilor subtitrării (când un utilizator mută fereastra) și oferă a Rect cu noile limite ale controalelor de legendă.
  • ActivityInfo.WindowLayout: această clasă conține informații declarate în manifestul aplicației cu privire la poziționarea inițială a unei ferestre cu formă liberă pe care o aplicație o poate solicita la lansare. De exemplu, puteți enumera următoarele în eticheta manifestului dvs.:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Apoi, când dispozitivul este deja în modul liber și aplicația este lansată, se va lansa cu aceste limite specificate.

Exemple de modul fereastră cu formă liberă în acțiune

Bara de activități adaugă un meniu de pornire și o bară de aplicații recente pentru a completa modul fereastră cu formă liberă

În vara lui 2016, în timp ce Android Nougat era încă o previzualizare pentru dezvoltatori, am lansat o aplicație numită Bara de activități care oferă un meniu de pornire asemănător Windows și o listă de aplicații recente într-o suprapunere de sistem. Le permite utilizatorilor de pe Nougat să lanseze aplicații în modul fereastră cu formă liberă - și, deoarece Bara de activități folosește o suprapunere, poate rămâne pe ecran în mediul ferestrei cu formă liberă. Combinația dintre Taskbar și modul freeform oferă oricărui dispozitiv Android, în special tabletelor, o senzație asemănătoare PC-ului.

Puteți descărcați bara de activități pe Google Play sau vizualiza codul sursa tu pe GitHub. Pe lângă conceptele menționate în acest articol, folosesc și câteva trucuri pentru a menține activ mediul în mod liber, chiar și atunci când nu sunt afișate ferestre libere pe ecran. De asemenea, utilizatorii pot seta opțional Bara de activități ca lansator implicit pentru a permite dispozitivului lor să pornească automat în mediul în modul liber.

Deoarece nu există dispozitive care să fie livrate oficial cu suport pentru ferestre libere activat de OEM (în momentul în care scriem acest articol), recomand folosind Taskbar ca instrument pentru dezvoltatori pentru a-și testa aplicațiile în mediul de fereastră cu formă liberă pe dispozitive care altfel nu acceptă aceasta.

Pe lângă bara de activități, am modificat și codul sursă Launcher3 de la AOSP pentru a-i permite să lanseze aplicații în modul liber. Aceasta este o clonă directă a lansatorului Android 7.1.1, cu modificările minime necesare pentru a-i permite să lanseze aplicații cu formă liberă. Am oferit acest lansator modificat în speranța că alți dezvoltatori vor implementa suport pentru lansarea ferestrelor cu formă liberă în lansatoarele lor personalizate. Puteți vizualiza codul sursa pe GitHub sau descărcați un exemplu de APK.

Speranța mea este că dezvoltatorii de lansatoare personalizate pot utiliza acest cod și pot activa suport pentru lansarea freeform aplicații ferestre pentru acei utilizatori care doresc o mai mare flexibilitate pentru gestionarea ferestrelor pe ecranul lor mare dispozitive.