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.
- 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: 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)
Forstå aktivitetens livssyklus
De. aktivitets livssyklus er uendret i flervindusmodus: 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.
-
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.
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 – brukMediaSession#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.
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
ellerView#DRAG_FLAG_GLOBAL_URI_WRITE
, som hensiktsmessig.
- Nytt alias for
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 avPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
ogPackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE
hhv.
- De
android: windowBackground
attributt kan brukes som bakgrunnstegning hvis aktiviteten endres og gjengivelsen henger etter. Hvisandroid: windowBackground
er deaktivert,android: windowBackgroundFallback
brukes i stedet. Se eksempelappen for Multi-Window Playground for et eksempel.
- 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.
- Dokumentasjon for flere vinduer.
- Retningslinjer for materialdesign for delt skjermmodus.
- Eksempel på app med flere vinduer.