Multi-Window i Android N: Hva utviklere trenger å vite for å få det beste ut av det

Vi gir en oversikt over hva den kommende flervindusstøtten i Android N betyr for utviklere, og hvordan du kan gjøre det beste ut av det!

Støtte for flere vinduer er en fin funksjon vi venter på i Android N, og en vi har ønsket skal være tilgjengelig på alle enheter i lang tid. For at det skal være en fornøyelig opplevelse, kan utviklere imidlertid måtte gjøre noen endringer i appene sine for å støtte det riktig.

En av Google I/O-øktene var for utviklere å lære om de nye API-ene og systematferdsendringene som støtte for flere vinduer.

Sesjonen ble presentert av Wale Ogunwale, teknisk leder for Android ActivityManager og WindowManager-rammekomponenter -- han og teamet hans er de ansvarlige for multi-vindu på Android.

Du kan se Multi-Window-modusøkt på YouTube, men vi gir også en oversikt over økten her.

N introduserer tre forskjellige multi-vindusmoduser:
  • Delt skjerm-modus: dette er modusen som er tilgjengelig som standard. Som navnet tilsier, lar den deg åpne to applikasjoner side ved side.
  • Friformmodus: produsenter kan aktivere dette på større enheter, noe som lar brukere fritt endre størrelse på aktiviteter i tillegg til delt skjermmodus.
  • Bilde-i-bilde-modus: rettet mot Android TV-enheter, denne modusen er beregnet på at videospillere skal kjøre i et festet vindu mens brukeren samhandler med andre applikasjoner.
Android N delt skjermmodusAndroid N PiP-modus
Det er verdt å merke seg det. vi har dekket multi-vindu på N før og gitt litt kritikk av det nåværende systemet. Med det i tankene håper vi at friformmodusen beveger seg litt nærmere bilde-i-bilde-modusen, da det ville ha nyttige applikasjoner på alle enheter.
Å aktivere støtte for flere vinduer i appene dine er enkelt: du trenger ikke å gjøre noe hvis du allerede målretter mot N. Skulle du velge å deaktivere multivinduer, kan du gjøre det ved å angi. android: resizeableActivity aktivitetsattributt i manifestet til. false. Dette bør bare gjøres hvis det virkelig er berettiget, siden det gjør at appen din alltid skiller seg ut på en dårlig måte starter i fullskjermmodus selv om brukeren (eller en annen app) prøver å starte den i flere vinduer modus. Det er viktig å merke seg at attributtene til en rotaktivitet gjelder for alle aktiviteter i oppgavestabelen. Med andre ord, hvis du har en aktivitet som kan startes av andre apper, sørg for at den støtter flervindusmodus ettersom du ikke kan garantere at andre apper starter aktiviteten din i en ny oppgave ved hjelp av. Intent#FLAG_ACTIVITY_NEW_TASK Støtte for .Bilde-i-bilde-modus må deklareres eksplisitt via. android: supportsPictureInPicture Egenskap. Merk at dette attributtet ignoreres if. android: resizeableActivity er. false .Layoutattributter kan brukes til å angi standarddimensjoner og plassering for friformsvinduer, eller for å spesifisere en minimal bredde eller høyde både for friforms- og delt skjermmodus:
  • android: defaultWidth/android: defaultHeight: standarddimensjonene til aktiviteten (friformmodus).
  • android: gravity: startposisjonen til aktiviteten (friformmodus).
  • android: minimalWidth/android: minimalHeight: de minimale dimensjonene til aktiviteten (friform og delt skjermmodus)
Du kan finne et kodeeksempel i. Googles Multi-Window Playground eksempel-app på GitHub: AndroidManifest.xml.
Med introduksjonen av støtte for flere vinduer, må du kanskje dobbeltsjekke et par ting i appene dine for å sikre at de fungerer som de skal.

Forstå aktivitetens livssyklus

De. aktivitets livssyklus er uendret i flervindusmodus: Android Activity Basic Lifecycle Når det er sagt, kan noen subtile forskjeller mellom aktivitetstilstandene resultere i utilsiktet oppførsel du normalt ikke vil legge merke til før N. Det er viktig å vite det. Activity#onResume() og. Activity#onPause() kalles når appen din får eller mister fokus, men ikke nødvendigvis når den starter eller slutter å være synlig. (Husk at kun én app kan ha fokus til enhver tid.)For apper som oppdaterer innholdet kontinuerlig (f.eks. videoavspilling), sørg for å håndtere start og stopp av innholdsoppdateringer. Activity#onStart() og. Activity#onStop() i stedet. Ikke gjør det for videoapper, for eksempel, vil bety at avspilling bare skjer hvis appen er fokusert, som beseirer formålet med flervindusmodus. Den offisielle YouTube-appen hadde et lignende problem da Android N Developer Preview først ble lansert.

Håndtering av kjøretidsendringer

Når en app settes i flervindusmodus, vil noen enhetskonfigurasjoner endres. Du kan enten la aktiviteten starte på nytt (i så fall. beholde Fragmenter kan være en god idé, hvis aktiviteten din må utføre en intensiv operasjon ved oppstart), eller velge å. håndtere konfigurasjonsendringene eksplisitt i stedet. Fire enhetskonfigurasjoner kan endres når du går inn i eller inne i flervindusmodus: screenSize, smallestScreenSize, screenLayout og. orientation. Referere til. Android-utviklerdokumentasjon for mer informasjon om hvert attributt, men merk det. orientation refererer ikke lenger til enhetens orientering i dette tilfellet. I stedet indikerer det bare om aktivitetens bredde er større enn høyden (landskap) eller ikke (portrett). Å erklære at aktiviteten din vil håndtere disse endringene kan gjøres fra manifestet:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Husk at dette betyr at du faktisk må håndtere disse endringene i. Activity#onConfigurationChanged(), ved å manuelt oppdatere visninger eller laste inn noen ressurser på nytt.

Deaktiverte funksjoner i flervindusmodus

Noen systemfunksjoner vil ikke bli påvirket av aktivitetene dine mens du er i flervindusmodus:
  • Endringer i statuslinjen og navigasjonslinjen, som å dimme/skjule systemlinjene eller bruke oppslukende modus, vil ikke ha noen effekt. Dette er fornuftig siden aktiviteten din bare opptar en del av skjermen.
  • De android: screenOrientation aktivitetsattributt har heller ingen effekt i flervindusmodus: siden aktiviteten din kan endre størrelse, er det ikke lenger fornuftig at den har en fast orientering.
Nye tilbakeringinger er lagt til for hendelser med flere vinduer, samt metoder for å spørre om gjeldende tilstand.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): kalles når aktivitetstilstand endres fra fullskjerm til multivindu og omvendt.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): kalles når aktivitetstilstand endres til/fra PIP-modus.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): returner om aktiviteten er i multi-vindu/bilde-i-bilde-modus eller ikke.
  • Activity#overlayWithDecorCaption(boolean overlay): for vinduer med fritt format kan denne metoden brukes til å få bildeteksten (linjen som brukes til å dra vinduet rundt) over innholdet i stedet for å trykke det ned.
PS. Utenom. Activity#overlayWithDecorCaption(), er disse metodene også levert av. Fragment klasse.

Starte aktiviteter i flervindusmodus

  • Activity#enterPictureInPictureMode() kan brukes til å sette en aktivitet i bilde-i-bilde-modus. Merk at aktiviteter i PiP-modus ikke blir varslet om inndatahendelser – bruk MediaSession#setMediaButtonReceiver() hvis du ønsker å håndtere slike hendelser. Sørg også for å sjekke Android Developers-nettstedet hvis du er interessert i Bilde-i-bilde på Android N.
  • Hvis enheten er i delt skjermmodus, kan du be systemet starte en annen aktivitet ved siden av din ved å bruke Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT flagg. Flagget har ingen effekt hvis det ikke er i delt skjermmodus.
  • Hvis enheten er i friformmodus, ActivityOptions#setLaunchBounds() kan brukes til å spesifisere den nye aktivitetens dimensjoner og plassering på skjermen.
For kodeeksempler, sjekk ut Multi-Window Playground-eksempelappen: eksempel på nærliggende aktivitet, lanseringsgrenser eksempel.

Dra og slipp

Mens dra og slipp-støtte har eksistert siden Honeycomb, var det tidligere bare mulig innenfor samme aktivitet. Det snør. støttes i multi-vinduer også. Å implementere dette ser ut til å være. stort sett det samme som før, med noen få tillegg for dra og slipp på tvers av aktiviteter:
  • View#startDragAndDrop()
    • Nytt alias for View#startDrag().
    • For å aktivere dra og slipp på tvers av aktiviteter, send det nye flagget View#DRAG_FLAG_GLOBAL.
    • Hvis du trenger å gi URI-tillatelser til mottakeraktiviteten, sender du de nye flaggene View#DRAG_FLAG_GLOBAL_URI_READ eller View#DRAG_FLAG_GLOBAL_URI_WRITE, som hensiktsmessig.
  • View#updateDragShadow()
    • Erstatter draskyggen for en draoperasjon som pågår. Kan bare kalles opp av appen som startet draoperasjonen.
  • View#cancelDragAndDrop()
    • Avbryter en draoperasjon som pågår. Kan bare kalles opp av appen som startet draoperasjonen.
  • Det er mulig å sjekke om en enhet støtter friform- eller bilde-i-bilde-modus via PackageManager#hasSystemFeature(), ved hjelp av PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT og PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE hhv.
  • De android: windowBackground attributt kan brukes som bakgrunnstegning hvis aktiviteten endres og gjengivelsen henger etter. Hvis android: windowBackground er deaktivert, android: windowBackgroundFallback brukes i stedet. Se eksempelappen for Multi-Window Playground for et eksempel.
Wale tilbød noen gode fremgangsmåter for å sikre at brukerne dine får en best mulig opplevelse:
  • Håndtaksmodus endres elegant:
    • Oppretthold UI-konsistens uavhengig av orientering. Ikke la elementer endre posisjon for å tillate jevne overganger.
    • Utvider det ovennevnte, ikke bytt mellom veldig forskjellige oppsett for telefon-/nettbrettoppsett. Tilpass i stedet nettbrettoppsettet for mindre størrelser for konsistens.
  • Sørg for at aktivitetene dine tilpasser seg små størrelser av følge Material Design-mønstrene.
  • Bruk FLAG_ACTIVITY_LAUNCH_ADJACENT når det er fornuftig å gi en mer fornøyelig opplevelse i delt skjermmodus.
  • Erklær kun inkompatibilitet med endring av størrelse når det er berettiget. Som vi diskuterte ovenfor, får appen din til å skille seg ut på en dårlig måte ellers.
Wale avsluttet økten med å tilby noen ekstra nyttige ressurser:
  • Dokumentasjon for flere vinduer.
  • Retningslinjer for materialdesign for delt skjermmodus.
  • Eksempel på app med flere vinduer.