Ferestre multiple în Android N: Ce trebuie să știe dezvoltatorii pentru a profita la maximum de asta

Oferim o privire de ansamblu asupra a ceea ce înseamnă viitorul suport pentru mai multe ferestre în Android N pentru dezvoltatori și cum să profitați la maximum de el!

Suportul pentru mai multe ferestre este o caracteristică bună pe care o așteptăm în Android N și unul pe care ne-am dorit de mult să fie disponibil pe toate dispozitivele. Pentru ca aceasta să fie o experiență plăcută, totuși, dezvoltatorii ar putea fi nevoiți să facă unele modificări în aplicațiile lor pentru a o susține corect.

Una dintre sesiunile Google I/O a fost ca dezvoltatorii să învețe despre noile API-uri și despre schimbările comportamentale ale sistemului pe care le aduce suportul pentru mai multe ferestre.

Sesiunea a fost prezentată de Wale Ogunwale, managerul principal tehnic pentru Android ActivityManager și Componentele cadrului WindowManager -- el și echipa sa sunt cei responsabili pentru mai multe ferestre pe Android.

Puteți urmări Sesiune în modul cu ferestre multiple pe YouTube, dar oferim și o prezentare generală a sesiunii aici.

N introduce trei moduri diferite de ferestre multiple:
  • Modul ecran divizat: acesta este modul care este disponibil implicit. După cum sugerează și numele, vă permite să deschideți două aplicații una lângă alta.
  • Modul Freeform: producătorii pot activa acest lucru pe dispozitive mai mari, ceea ce permite utilizatorilor să redimensioneze liber activitățile pe lângă modul cu ecran divizat.
  • Modul imagine în imagine: destinat dispozitivelor Android TV, acest mod este destinat ca playerele video să ruleze într-o fereastră fixată în timp ce utilizatorul interacționează cu alte aplicații.
Modul cu ecran împărțit Android NMod Android N PiP
Merită remarcat că. am abordat mai multe ferestre pe N înainte și am oferit câteva critici la adresa sistemului actual. Având în vedere acest lucru, sperăm că modul freeform se apropie puțin de modul picture-in-picture, deoarece ar avea aplicații utile pe toate dispozitivele.
Activarea suportului pentru mai multe ferestre în aplicațiile dvs. este simplă: nu trebuie să faceți nimic dacă vizați deja N. Dacă alegeți să dezactivați mai multe ferestre, puteți face acest lucru setând. android: resizeableActivity atributul de activitate din manifestul dvs. la. false. Acest lucru ar trebui făcut numai dacă este cu adevărat justificat, deoarece face ca aplicația dvs. să iasă în evidență într-un mod prost lansarea în modul ecran complet chiar dacă utilizatorul (sau altă aplicație) încearcă să o lanseze în ferestre multiple modul. Este important de reținut că atributele unei activități rădăcină se aplică tuturor activităților din stiva de sarcini. Cu alte cuvinte, dacă aveți o activitate care poate fi începută de alte aplicații, asigurați-vă că acceptă modul cu mai multe ferestre deoarece nu puteți garanta că alte aplicații vă vor lansa activitatea într-o nouă sarcină folosind. Intent#FLAG_ACTIVITY_NEW_TASK .Suportul modului Picture-in-picture trebuie declarat în mod explicit prin intermediul. android: supportsPictureInPicture atribut. Rețineți că acest atribut este ignorat dacă. android: resizeableActivity este. false .Atributele de aspect pot fi folosite pentru a seta dimensiunile și plasarea implicite pentru ferestrele cu formă liberă sau pentru a specifica o lățime sau o înălțime minimă atât pentru modurile cu formă liberă, cât și pentru ecranul divizat:
  • android: defaultWidth/android: defaultHeight: dimensiunile implicite ale activității (mod liber).
  • android: gravity: poziția inițială a activității (mod liber).
  • android: minimalWidth/android: minimalHeight: dimensiunile minime ale activității (modurile cu formă liberă și cu ecran divizat)
Puteți găsi un exemplu de cod în. Eșantion de aplicație Google Multi-Window Playground pe GitHub: AndroidManifest.xml.
Odată cu introducerea suportului pentru mai multe ferestre, ar putea fi necesar să verificați câteva lucruri din aplicațiile dvs. pentru a vă asigura că funcționează corect.

Înțelegerea ciclului de viață al activității

The. ciclul de viață al activității este neschimbat în modul cu mai multe ferestre: Ciclul de viață de bază al activității Android Acestea fiind spuse, unele diferențe subtile între stările de activitate pot duce la un comportament neintenționat pe care în mod normal nu l-ați observa înainte de N. Este important să știi asta. Activity#onResume() și. Activity#onPause() sunt apelate atunci când aplicația dvs. câștigă sau își pierde focalizarea, dar nu neapărat când începe sau încetează să fie vizibilă. (Rețineți că o singură aplicație poate fi focalizată la un moment dat.) Pentru aplicațiile care actualizează conținutul în mod constant (de exemplu, redarea videoclipurilor), asigurați-vă că gestionați pornirea și oprirea actualizărilor de conținut. Activity#onStart() și. Activity#onStop() in schimb. Nu face acest lucru pentru aplicațiile video, de exemplu, va însemna că redarea va avea loc numai dacă aplicația este focalizată, care înfrânge scopul modului cu mai multe ferestre. Aplicația oficială YouTube a avut o problemă similară când s-a lansat pentru prima dată Android N Developer Preview.

Gestionarea modificărilor de rulare

Când o aplicație este pusă în modul cu mai multe ferestre, unele configurații ale dispozitivului se vor schimba. Puteți fie să permiteți repornirea activității (caz în care. reținând Fragmente ar putea fi o idee bună, dacă activitatea dvs. trebuie să efectueze o operațiune intensivă la pornire), sau alegeți. gestionați în mod explicit modificările de configurare in schimb. Patru configurații ale dispozitivului se pot schimba la intrarea sau în modul cu ferestre multiple: screenSize, smallestScreenSize, screenLayout și. orientation. Consultați. Documentație pentru dezvoltatori Android pentru mai multe informații despre fiecare atribut, dar rețineți că. orientation nu se mai referă la orientarea dispozitivului în acest caz. În schimb, indică doar dacă lățimea activității dvs. este mai mare decât înălțimea ei (peisaj) sau nu (portret). Declararea că activitatea dumneavoastră se va ocupa de aceste modificări se poate face din manifest:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Rețineți că acest lucru înseamnă că va trebui de fapt să gestionați aceste modificări în. Activity#onConfigurationChanged(), prin actualizarea manuală a vizualizărilor sau reîncărcarea unor resurse.

Funcții dezactivate în modul cu mai multe ferestre

Unele funcții ale sistemului nu vor fi afectate de activitățile dvs. în modul cu mai multe ferestre:
  • Modificările barei de stare și ale barei de navigare, cum ar fi diminuarea/ascunderea barelor de sistem sau utilizarea modului imersiv, nu vor avea niciun efect. Acest lucru are sens, deoarece activitatea dvs. ocupă doar o parte a ecranului.
  • The android: screenOrientation Atributul de activitate nu are nici un efect în modul cu mai multe ferestre: deoarece activitatea dvs. va fi redimensionabilă, nu mai are sens ca aceasta să aibă o orientare fixă.
Au fost adăugate noi apeluri inverse pentru evenimentele cu mai multe ferestre, precum și metode de a interoga starea curentă.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): apelat când starea activității se schimbă de la ecran complet la ferestre multiple și invers.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): apelat când starea activității se schimbă în/din modul PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): returnează dacă activitatea este în modul cu mai multe ferestre/picture-in-picture sau nu.
  • Activity#overlayWithDecorCaption(boolean overlay): pentru ferestrele cu formă liberă, această metodă poate fi folosită pentru a face ca legenda (bara folosită pentru a trage fereastra) să suprapună conținutul în loc să-l împingă în jos.
PS. În afară de. Activity#overlayWithDecorCaption(), aceste metode sunt oferite și de către. Fragment clasă.

Pornirea activităților în modul cu mai multe ferestre

  • Activity#enterPictureInPictureMode() poate fi folosit pentru a pune o activitate în modul imagine în imagine. Rețineți că activitățile din modul PiP nu sunt notificate despre evenimentele de intrare -- utilizați MediaSession#setMediaButtonReceiver() dacă vrei să te ocupi de astfel de evenimente. De asemenea, asigurați-vă că verificați site-ul pentru dezvoltatori Android dacă sunteți interesat Imagine în imagine pe Android N.
  • Dacă dispozitivul este în modul ecran divizat, puteți spune sistemului să lanseze o altă activitate lângă a dvs. utilizând Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT steag. Steagul nu are efect dacă nu este în modul ecran divizat.
  • Dacă dispozitivul este în modul liber, ActivityOptions#setLaunchBounds() poate fi folosit pentru a specifica dimensiunile și locația noii activități pe ecran.
Pentru exemple de cod, consultați aplicația eșantion Multi-Window Playground: exemplu de activitate adiacentă, exemplu de lansare a limitelor.

Tragere și plasare

În timp ce suportul pentru glisare și plasare a existat de la Honeycomb, anterior era posibil doar în cadrul aceleiași activități. Ninge. suportat în ferestre multiple de asemenea. Implementarea acestui lucru pare să fie. în mare parte la fel ca înainte, cu câteva completări pentru tragerea și plasarea activităților încrucișate:
  • View#startDragAndDrop()
    • Alias ​​nou pentru View#startDrag().
    • Pentru a activa tragerea și plasarea activităților încrucișate, transmiteți noul steag View#DRAG_FLAG_GLOBAL.
    • Dacă trebuie să acordați permisiuni URI activității destinatarului, transmiteți noile steaguri View#DRAG_FLAG_GLOBAL_URI_READ sau View#DRAG_FLAG_GLOBAL_URI_WRITE, Asa Potrivit.
  • View#updateDragShadow()
    • Înlocuiește umbra de tragere pentru o operațiune de tragere în curs de desfășurare. Poate fi apelat numai de aplicația care a generat operația de glisare.
  • View#cancelDragAndDrop()
    • Anulează o operațiune de tragere în curs de desfășurare. Poate fi apelat numai de aplicația care a generat operația de glisare.
  • Verificarea dacă un dispozitiv acceptă modurile formă liberă sau imagine în imagine este posibilă prin PackageManager#hasSystemFeature(), folosind PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT și PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE respectiv.
  • The android: windowBackground Atributul poate fi folosit ca desen de fundal, dacă activitatea este redimensionată și redarea acesteia rămâne în urmă. Dacă android: windowBackground este nesetat, android: windowBackgroundFallback este folosit în schimb. Consultați aplicația eșantion Multi-Window Playground pentru un exemplu.
Wale a oferit câteva dintre cele mai bune practici pentru a se asigura că utilizatorii dvs. au cea mai bună experiență posibilă:
  • Modul mâner se schimbă elegant:
    • Menține consistența interfeței de utilizare indiferent de orientare. Nu lăsați elementele să își schimbe pozițiile pentru a permite tranziții ușoare.
    • Extinderea la cele de mai sus, nu comutați între aspecte foarte diferite pentru aspectul telefon/tabletă. În schimb, adaptați aspectul tabletei pentru dimensiuni mai mici pentru consecvență.
  • Asigurați-vă că activitățile dvs. se adaptează la dimensiuni mici de urmând modelele Material Design.
  • Utilizare FLAG_ACTIVITY_LAUNCH_ADJACENT atunci când are sens să creați o experiență mai plăcută în modul ecran divizat.
  • Declarați incompatibilitatea redimensionării numai atunci când este justificat. După cum am discutat mai sus, vă face aplicația să iasă în evidență într-un mod prost altfel.
Wale a încheiat sesiunea oferind câteva resurse suplimentare utile:
  • Documentație cu mai multe ferestre.
  • Ghid de proiectare a materialelor pentru modul ecran divizat.
  • Exemplu de aplicație cu mai multe ferestre.