Multi-Window i Android N: Vad utvecklare behöver veta för att göra det bästa av det

Vi ger en översikt över vad det kommande stödet för flera fönster i Android N innebär för utvecklare, och hur man gör det bästa av det!

Stöd för flera fönster är en snygg funktion som vi väntar på i Android N, och en som vi länge velat ska vara tillgänglig på alla enheter. För att det ska bli en trevlig upplevelse kan utvecklare dock behöva göra några ändringar i sina appar för att stödja det korrekt.

En av Googles I/O-sessioner var för utvecklare att lära sig om de nya API: er och systembeteendeförändringar som stöd för flera fönster medför.

Sessionen presenterades av Wale Ogunwale, Technical Lead Manager för Android ActivityManager och WindowManager-ramkomponenter -- han och hans team är de ansvariga för multi-window på Android.

Du kan titta på Session med flera fönsterläge på YouTube, men vi ger också en översikt över sessionen här.

N introducerar tre olika lägen för flera fönster:
  • Delat skärmläge: detta är läget som är tillgängligt som standard. Som namnet antyder låter den dig öppna två applikationer sida vid sida.
  • Freeform-läge: tillverkare kan aktivera detta på större enheter, vilket tillåter användare att fritt ändra storlek på aktiviteter utöver läget för delad skärm.
  • Bild-i-bild-läge: riktat till Android TV-enheter, detta läge är avsett för videospelare att köra i ett fäst fönster medan användaren interagerar med andra applikationer.
Android N delat skärmlägeAndroid N PiP-läge
Det är värt att notera det. vi har täckt flera fönster på N tidigare och erbjudit en del kritik av det nuvarande systemet. Med det i åtanke hoppas vi att friformsläget flyttar sig lite närmare bild-i-bild-läget, eftersom det skulle ha användbara applikationer på alla enheter.
Att aktivera stöd för flera fönster i dina appar är enkelt: du behöver inte göra någonting om du redan riktar in dig på N. Om du väljer att inaktivera flera fönster kan du göra det genom att ställa in. android: resizeableActivity aktivitetsattribut i ditt manifest till. false. Detta bör bara göras om det verkligen är motiverat, eftersom det gör att din app alltid sticker ut på ett dåligt sätt startar i helskärmsläge även om användaren (eller en annan app) försöker starta den i flera fönster läge. Det är viktigt att notera att en rotaktivitets attribut gäller för alla aktiviteter i dess aktivitetsstack. Med andra ord, om du har en aktivitet som kan startas av andra appar, se till att den stöder flerfönsterläge eftersom du inte kan garantera att andra appar kommer att starta din aktivitet i en ny uppgift med hjälp av. Intent#FLAG_ACTIVITY_NEW_TASK Stöd för .Bild-i-bild-läge måste deklareras uttryckligen via. android: supportsPictureInPicture attribut. Observera att detta attribut ignoreras if. android: resizeableActivity är. false .Layoutattribut kan användas för att ställa in standardmått och placering för friformsfönster, eller för att ange en minimal bredd eller höjd för både friforms- och delad skärmläge:
  • android: defaultWidth/android: defaultHeight: aktivitetens standardmått (friformsläge).
  • android: gravity: startpositionen för aktiviteten (friformsläge).
  • android: minimalWidth/android: minimalHeight: aktivitetens minimala dimensioner (friforms- och delad skärmlägen)
Du kan hitta ett kodexempel i. Googles Multi-Window Playground-exempelapp på GitHub: AndroidManifest.xml.
Med introduktionen av stöd för flera fönster kan du behöva dubbelkolla några saker i dina appar för att se till att de fungerar korrekt.

Förstå aktivitetens livscykel

De. aktivitetens livscykel är oförändrad i flerfönsterläge: Android Activity Basic Lifecycle Som sagt, vissa subtila skillnader mellan aktivitetstillstånden kan resultera i oavsiktligt beteende som du normalt inte skulle märka före N. Det är viktigt att veta det. Activity#onResume() och. Activity#onPause() anropas när din app får eller tappar fokus, men inte nödvändigtvis när den startar eller slutar vara synlig. (Kom ihåg att endast en app kan ha fokus vid varje given tidpunkt.) För appar som uppdaterar innehållet konstant (t.ex. videouppspelning), se till att hantera start och stopp av innehållsuppdateringar. Activity#onStart() och. Activity#onStop() istället. Att inte göra det för videoappar, till exempel, innebär att uppspelning endast sker om appen är fokuserad, som motverkar syftet med flerfönsterläge. Den officiella YouTube-appen hade ett liknande problem när Android N Developer Preview först lanserades.

Hantera körtidsändringar

När en app sätts i flerfönsterläge kommer vissa enhetskonfigurationer att ändras. Du kan antingen tillåta att din aktivitet startas om (i så fall. kvarhålla fragment kan vara en bra idé om din aktivitet måste utföra en intensiv operation vid start), eller väljer att göra det. hantera konfigurationsändringarna explicit istället. Fyra enhetskonfigurationer kan ändras när du går in i eller i flerfönsterläge: screenSize, smallestScreenSize, screenLayout och. orientation. Referera till. Dokumentation för Android-utvecklare för mer information om varje attribut, men notera det. orientation hänvisar inte längre till enhetens orientering i detta fall. Istället indikerar det bara om din aktivitets bredd är större än dess höjd (liggande) eller not (porträtt). Du kan förklara att din aktivitet kommer att hantera dessa ändringar från manifestet:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Tänk på att detta betyder att du faktiskt måste hantera dessa ändringar i. Activity#onConfigurationChanged(), genom att manuellt uppdatera vyer eller ladda om vissa resurser.

Inaktiverade funktioner i multi-fönsterläge

Vissa systemfunktioner kommer inte att påverkas av dina aktiviteter i flerfönsterläge:
  • Ändringar i statusfältet och navigeringsfältet, som att dämpa/dölja systemfälten eller använda uppslukande läge, har ingen effekt. Detta är vettigt eftersom din aktivitet bara upptar en del av skärmen.
  • De android: screenOrientation aktivitetsattribut har inte heller någon effekt i flerfönsterläge: eftersom din aktivitet kommer att kunna ändras i storlek är det inte längre meningsfullt att den har en fast orientering.
Nya återuppringningar har lagts till för händelser med flera fönster, såväl som metoder för att fråga om det aktuella tillståndet.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): anropas när aktivitetsstatus ändras från helskärm till multifönster och vice versa.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): anropas när aktivitetstillstånd ändras till/från PIP-läge.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): returnerar om aktiviteten är i multi-fönster/bild-i-bild-läge eller inte.
  • Activity#overlayWithDecorCaption(boolean overlay): för fönster i fritt format kan den här metoden användas för att göra bildtexten (stapeln som används för att dra runt fönstret) över innehållet istället för att trycka ner det.
PS. Förutom. Activity#overlayWithDecorCaption(), dessa metoder tillhandahålls också av. Fragment klass.

Starta aktiviteter i flerfönsterläge

  • Activity#enterPictureInPictureMode() kan användas för att sätta en aktivitet i bild-i-bild-läge. Observera att aktiviteter i PiP-läge inte aviseras om inmatningshändelser - använd MediaSession#setMediaButtonReceiver() om du vill hantera sådana händelser. Se också till att kolla Android Developers-webbplatsen om du är intresserad av Bild-i-bild på Android N.
  • Om enheten är i delad skärmläge kan du be systemet att starta en annan aktivitet bredvid din genom att använda Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT flagga. Flaggan har ingen effekt om den inte är i delad skärmläge.
  • Om enheten är i friformsläge, ActivityOptions#setLaunchBounds() kan användas för att ange den nya aktivitetens mått och plats på skärmen.
För kodexempel, kolla in Multi-Window Playground exempelappen: exempel på närliggande aktivitet, exempel på lanseringsgränser.

Dra och släpp

Medan dra och släpp-stöd har funnits sedan Honeycomb, var det tidigare bara möjligt inom samma aktivitet. Det snöar. stöds i flera fönster också. Att genomföra detta verkar vara. mestadels samma som tidigare, med några tillägg för att dra och släppa flera aktiviteter:
  • View#startDragAndDrop()
    • Nytt alias för View#startDrag().
    • För att aktivera drag och släpp för flera aktiviteter, skicka den nya flaggan View#DRAG_FLAG_GLOBAL.
    • Om du behöver ge URI-behörigheter till mottagaraktiviteten skickar du de nya flaggorna View#DRAG_FLAG_GLOBAL_URI_READ eller View#DRAG_FLAG_GLOBAL_URI_WRITE, efter behov.
  • View#updateDragShadow()
    • Ersätter dragskuggan för en pågående dragoperation. Kan endast anropas av appen som startade dragoperationen.
  • View#cancelDragAndDrop()
    • Avbryter en pågående dragoperation. Kan endast anropas av appen som startade dragoperationen.
  • Det går att kontrollera om en enhet stöder friforms- eller bild-i-bild-lägen via PackageManager#hasSystemFeature(), använder sig av PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT och PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE respektive.
  • De android: windowBackground attribut kan användas som bakgrundsritning, om aktiviteten ändras och dess rendering släpar efter. Om android: windowBackground är avstängd, android: windowBackgroundFallback används istället. Se exempelappen för Multi-Window Playground för ett exempel.
Wale erbjöd några bästa metoder för att se till att dina användare får den bästa möjliga upplevelsen:
  • Handtagsläget ändras elegant:
    • Upprätthåll UI-konsistens oavsett orientering. Låt inte element ändra positioner för att möjliggöra mjuka övergångar.
    • Utvidgar det ovanstående, växla inte mellan väldigt olika layouter för telefon-/surfplattalayouter. Anpassa istället surfplattans layout för mindre storlekar för konsistens.
  • Se till att dina aktiviteter anpassar sig till små storlekar förbi efter materialdesignmönstren.
  • Använda sig av FLAG_ACTIVITY_LAUNCH_ADJACENT när det är vettigt att skapa en roligare upplevelse i delad skärm.
  • Deklarera endast inkompatibilitet med storleksändring när det är motiverat. Som vi diskuterade ovan gör det att din app sticker ut på ett dåligt sätt annars.
Wale avslutade sessionen med att erbjuda några ytterligare användbara resurser:
  • Dokumentation för flera fönster.
  • Riktlinjer för materialdesign för delat skärmläge.
  • Exempel på app för flera fönster.