Multi-Window i Android N: Hvad udviklere behøver at vide for at få det bedste ud af det

Vi giver et overblik over, hvad den kommende understøttelse af flere vinduer i Android N betyder for udviklere, og hvordan man får det bedste ud af det!

Understøttelse af flere vinduer er en smart funktion, vi venter på i Android N, og en vi længe har ønsket skal være tilgængelig på alle enheder. For at det skal være en fornøjelig oplevelse, skal udviklere dog muligvis foretage nogle ændringer i deres apps for at understøtte det korrekt.

En af Google I/O-sessionerne var for udviklere at lære om de nye API'er og systemadfærdsændringer, som understøttelse af flere vinduer medfører.

Sessionen blev præsenteret af Wale Ogunwale, Technical Lead Manager for Android ActivityManager og WindowManager-rammekomponenter -- han og hans team er dem, der er ansvarlige for multi-window på Android.

Du kan se Multi-Window mode session på YouTube, men vi giver også et overblik over sessionen her.

N introducerer tre forskellige multi-window modes:
  • Split-screen-tilstand: Dette er den tilstand, der er tilgængelig som standard. Som navnet antyder, giver det dig mulighed for at åbne to applikationer side om side.
  • Freeform-tilstand: Producenterne kan aktivere dette på større enheder, hvilket giver brugerne mulighed for frit at ændre størrelse på aktiviteter ud over tilstanden med delt skærm.
  • Billede-i-billede-tilstand: rettet mod Android TV-enheder, denne tilstand er beregnet til, at videoafspillere kan køre i et fastgjort vindue, mens brugeren interagerer med andre applikationer.
Android N Split-Screen ModeAndroid N PiP-tilstand
Det er værd at bemærke det. vi har dækket multi-vindue på N før og givet en del kritik af det nuværende system. Med det i tankerne håber vi, at friformstilstanden rykker en smule tættere på billede-i-billede-tilstanden, da det ville have nyttige applikationer på alle enheder.
Det er enkelt at aktivere understøttelse af flere vinduer i dine apps: du behøver ikke at gøre noget, hvis du allerede målretter mod N. Hvis du vælger at deaktivere multi-vindue, kan du gøre det ved at indstille. android: resizeableActivity aktivitetsattribut i dit manifest til. false. Dette bør kun gøres, hvis det virkelig er berettiget, da det altid får din app til at skille sig ud på en dårlig måde starter i fuldskærmstilstand, selvom brugeren (eller en anden app) forsøger at starte den i flere vinduer mode. Det er vigtigt at bemærke, at en rodaktivitets attributter gælder for alle aktiviteter i dens opgavestak. Med andre ord, hvis du har en aktivitet, der kan startes af andre apps, skal du sørge for, at den understøtter multi-vindue-tilstand da du ikke kan garantere, at andre apps vil starte din aktivitet i en ny opgave vha. Intent#FLAG_ACTIVITY_NEW_TASK Understøttelse af billed-i-billede-tilstand skal erklæres eksplicit via. android: supportsPictureInPicture attribut. Bemærk, at denne attribut ignoreres if. android: resizeableActivity er. false .Layoutattributter kan bruges til at indstille standarddimensioner og -placering for fritformede vinduer eller til at angive en minimal bredde eller højde både for friforms- og delt-skærmtilstande:
  • android: defaultWidth/android: defaultHeight: standarddimensionerne for aktiviteten (frit format).
  • android: gravity: aktivitetens startposition (friformstilstand).
  • android: minimalWidth/android: minimalHeight: aktivitetens minimale dimensioner (friform og delt skærm)
Du kan finde et kodeeksempel i. Googles Multi-Window Playground eksempel-app på GitHub: AndroidManifest.xml.
Med introduktionen af ​​understøttelse af flere vinduer skal du muligvis dobbelttjekke et par ting i dine apps for at sikre, at de fungerer korrekt.

Forståelse af aktivitetens livscyklus

Det. aktivitets livscyklus er uændret i multi-vindue tilstand: Android Activity Basic Lifecycle Når det er sagt, kan nogle subtile forskelle mellem aktivitetstilstandene resultere i utilsigtet adfærd, som du normalt ikke ville bemærke før N. Det er vigtigt at vide det. Activity#onResume() og. Activity#onPause() kaldes, når din app vinder eller mister fokus, men ikke nødvendigvis når den starter eller holder op med at være synlig. (Husk, at kun én app kan have fokus på et givet tidspunkt.) For apps, der opdaterer indholdet konstant (f.eks. videoafspilning), skal du sørge for at håndtere start og stop af indholdsopdateringer. Activity#onStart() og. Activity#onStop() i stedet. Gør det ikke for videoapps, f.eks. vil betyde, at afspilning kun sker, hvis appen er fokuseret, som besejrer formålet med multi-window mode. Den officielle YouTube-app havde et lignende problem, da Android N Developer Preview først blev lanceret.

Håndtering af runtime ændringer

Når en app sættes i multi-vindue-tilstand, ændres nogle enhedskonfigurationer. Du kan enten tillade din aktivitet at genstarte (i så fald. tilbageholdende Fragmenter kan være en god idé, hvis din aktivitet skal udføre en intensiv operation ved opstart), eller vælger at. håndtere konfigurationsændringerne eksplicit i stedet. Fire enhedskonfigurationer kan ændre sig, når de går ind i eller i multi-vindue tilstand: screenSize, smallestScreenSize, screenLayout og. orientation. Der henvises til. Android-udviklerdokumentation for mere information om hver egenskab, men bemærk det. orientation henviser ikke længere til enhedens orientering i dette tilfælde. I stedet angiver det blot, om din aktivitets bredde er større end dens højde (landskab) eller ikke (portræt). At erklære, at din aktivitet vil håndtere disse ændringer, kan gøres fra manifestet:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Husk, at det betyder, at du rent faktisk skal håndtere disse ændringer. Activity#onConfigurationChanged(), ved manuelt at opdatere visninger eller genindlæse nogle ressourcer.

Deaktiverede funktioner i Multi-Window Mode

Nogle systemfunktioner vil ikke blive påvirket af dine aktiviteter, mens du er i multi-vindue-tilstand:
  • Ændringer i statuslinjen og navigationslinjen, såsom at dæmpe/skjule systembjælkerne eller bruge fordybende tilstand, har ingen effekt. Dette giver mening, da din aktivitet kun fylder en del af skærmen.
  • Det android: screenOrientation aktivitetsattribut har heller ingen effekt i multi-vindue-tilstand: da din aktivitet kan ændres, giver det ikke længere mening, at den har en fast orientering.
Nye tilbagekald er blevet tilføjet til begivenheder med flere vinduer, samt metoder til at forespørge om den aktuelle tilstand.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): kaldes, når aktivitetstilstanden ændres fra fuldskærm til multi-vindue og omvendt.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): kaldes, når aktivitetstilstand ændres til/fra PIP-tilstand.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): returnerer om aktiviteten er i multi-vindue/billede-i-billede-tilstand eller ej.
  • Activity#overlayWithDecorCaption(boolean overlay): for freeform-vinduer kan denne metode bruges til at få billedteksten (bjælken, der bruges til at trække vinduet rundt) til at overlejre indholdet i stedet for at skubbe det ned.
PS. Med undtagelse af. Activity#overlayWithDecorCaption(), er disse metoder også leveret af. Fragment klasse.

Start af aktiviteter i Multi-Window Mode

  • Activity#enterPictureInPictureMode() kan bruges til at sætte en aktivitet i billed-i-billede-tilstand. Bemærk, at aktiviteter i PiP-tilstand ikke får besked om inputhændelser - brug MediaSession#setMediaButtonReceiver() hvis du ønsker at håndtere sådanne arrangementer. Sørg også for at tjekke Android Developers-webstedet, hvis du er interesseret i Billede-i-billede på Android N.
  • Hvis enheden er i delt skærmtilstand, kan du bede systemet om at starte en anden aktivitet ved siden af ​​din ved at bruge Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT flag. Flaget har ingen effekt, hvis det ikke er i delt skærmtilstand.
  • Hvis enheden er i fri form, ActivityOptions#setLaunchBounds() kan bruges til at angive den nye aktivitets dimensioner og placering på skærmen.
For kodeeksempler, tjek prøve-appen Multi-Window Playground: eksempel på tilstødende aktivitet, lanceringsgrænser eksempel.

Træk og slip

Mens træk og slip-support har eksisteret siden Honeycomb, var det tidligere kun muligt inden for den samme aktivitet. Det sneer. understøttet i multi-vindue såvel. Det ser ud til at implementere dette. stort set det samme som før, med et par tilføjelser til træk og slip på tværs af aktiviteter:
  • View#startDragAndDrop()
    • Nyt alias for View#startDrag().
    • For at aktivere træk og slip på tværs af aktiviteter skal du videregive det nye flag View#DRAG_FLAG_GLOBAL.
    • Hvis du har brug for at give URI-tilladelser til modtageraktiviteten, skal du videregive de nye flag View#DRAG_FLAG_GLOBAL_URI_READ eller View#DRAG_FLAG_GLOBAL_URI_WRITE, som passende.
  • View#updateDragShadow()
    • Erstatter trækskyggen for en igangværende trækhandling. Kan kun kaldes af den app, der startede trækoperationen.
  • View#cancelDragAndDrop()
    • Annullerer en igangværende trækhandling. Kan kun kaldes af den app, der startede trækoperationen.
  • Det er muligt at kontrollere, om en enhed understøtter freeform eller billede-i-billede-tilstande via PackageManager#hasSystemFeature(), ved brug af PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT og PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE henholdsvis.
  • Det android: windowBackground attribut kan bruges som baggrundstegning, hvis aktiviteten ændres, og dens gengivelse halter bagefter. Hvis android: windowBackground er deaktiveret, android: windowBackgroundFallback bruges i stedet. Se eksempel-appen til Multi-Window Playground for et eksempel.
Wale tilbød nogle bedste fremgangsmåder for at sikre, at dine brugere får den bedst mulige oplevelse:
  • Håndteringstilstand skifter elegant:
    • Oprethold UI-konsistens uanset orientering. Lad ikke elementer ændre positioner for at tillade jævne overgange.
    • Udvider ovenstående, skift ikke mellem meget forskellige layouts til telefon/tablet-layout. Tilpas i stedet tabletlayoutet til mindre størrelser for at opnå ensartethed.
  • Sørg for, at dine aktiviteter tilpasser sig små størrelser ved efter Materiale Design-mønstrene.
  • Brug FLAG_ACTIVITY_LAUNCH_ADJACENT når det giver mening at skabe en mere behagelig oplevelse i delt skærmtilstand.
  • Erklær kun ændring af størrelsesinkompatibilitet, når det er berettiget. Som vi diskuterede ovenfor, får det din app til at skille sig ud på en dårlig måde ellers.
Wale afsluttede sessionen med at tilbyde nogle yderligere nyttige ressourcer:
  • Dokumentation til flere vinduer.
  • Materiale Design retningslinjer for split-screen mode.
  • Eksempel på app til flere vinduer.