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.
- 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: 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)
Förstå aktivitetens livscykel
De. aktivitetens livscykel är oförändrad i flerfönsterläge: 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.
-
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.
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ändMediaSession#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.
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
ellerView#DRAG_FLAG_GLOBAL_URI_WRITE
, efter behov.
- Nytt alias för
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 avPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
ochPackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE
respektive.
- De
android: windowBackground
attribut kan användas som bakgrundsritning, om aktiviteten ändras och dess rendering släpar efter. Omandroid: windowBackground
är avstängd,android: windowBackgroundFallback
används istället. Se exempelappen för Multi-Window Playground för ett exempel.
- 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.
- Dokumentation för flera fönster.
- Riktlinjer för materialdesign för delat skärmläge.
- Exempel på app för flera fönster.