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.
- 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.
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)
Înțelegerea ciclului de viață al activității
The. ciclul de viață al activității este neschimbat în modul cu mai multe ferestre: 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ă.
-
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.
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țiMediaSession#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.
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
sauView#DRAG_FLAG_GLOBAL_URI_WRITE
, Asa Potrivit.
- Alias nou pentru
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()
, folosindPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
șiPackageManager#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.
- 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.
- Documentație cu mai multe ferestre.
- Ghid de proiectare a materialelor pentru modul ecran divizat.
- Exemplu de aplicație cu mai multe ferestre.