Freeform multi-window läge är en underutnyttjad och underskattad funktion i Android Nougat. Vi förklarar vad det är och hur utvecklare kan införliva det.
När Android 7.0 Nougat först tillkännagavs tidigt 2016, förde det med sig en mycket efterfrågad funktion till Android-plattformen – stöd för flera fönster. De flesta är medvetna om stödet för delad skärm med flera fönster som är aktiverat som standard på alla Android Nougat-telefoner och surfplattor. Android TV-enheter med Android Nougat kommer med stöd för bild-i-bild-stöd för flera fönster.
Det finns dock ett tredje flerfönsterläge i Android Nougat som inte särskilt många känner till: fritt format fönsterläge. Det här läget tillåter Android att presentera appar som flytande fönster som kan flyttas och storleksändras av användaren. Det är i huvudsak Androids implementering av en stapling fönsterhanterare.
I den Android SDK-dokumentation, står det att:
Tillverkare av större enheter kan välja att aktivera fritt format, där användaren fritt kan ändra storlek på varje aktivitet. Om tillverkaren aktiverar den här funktionen erbjuder enheten friformsläge utöver delad skärmläge.
Och även i Android 7.0 CDD:
Enhetsimplementeringar med skärmstorlek xlarge SKA stödja fritt format.
Detta indikerar att alla nya Android-enheter med stor skärm som levereras med Android 7.0 potentiellt kan ha friformsfönsterläge aktiverat av tillverkaren.
Detta är dock absolut inget svårt krav. Det går att tvinga några Android Nougat-enhet (med utvecklaralternativ aktiverade) för att stödja friformsfönsterläge med en av två olika metoder:
Aktiverar fönsterläge i fritt format på alla Android Nougat-enheter
Metod 1 (en dator med adb krävs)
Se till att USB Debugging är aktiverat i Utvecklaralternativ. Anslut sedan din enhet till en dator med adb installerat och kör följande kommando:
adb shell settings put global enable_freeform_support 1
Metod 2 (inga ytterligare krav)
Aktivera alternativet "Tvinga aktiviteter att ändra storlek" längst ned i Utvecklaralternativ.
Båda dessa metoder kräver att systemgränssnittet startas om innan de kan träda i kraft. Det enklaste sättet att göra detta är att starta om din enhet (eller, om din enhet är rotad, kan du helt enkelt döda com.android.systemui
bearbeta)
OK, så friformsläget är aktiverat... vad nu?
Om du aktiverade fritt format med metod 1, kommer det att finnas en ny knapp på appposter i översiktsmenyn för att starta en app i fritt format fönsterläge.
Med metod 2 är det dock inte möjligt att starta en app i fritt format via Android själv. Lyckligtvis, det är möjligt för vilken tredjepartsstartare som helst att starta en app i fritt format fönsterläge använder standard Android API: er som slutfördes som en del av API nivå 24.
Nyckeln till att starta en app i fritt format är att anropa ActivityOptions.setLaunchBounds()
metod. Denna metod tar en Rect
som ett argument, som innehåller fönstergränserna som appen kommer att starta med.
Du kan sedan starta appen med startActivity(Intent, Bundle)
. Om du inte redan har en ActivityOptions
paket kan du skapa en med ActivityOptions.makeBasic()
och sedan ringer setLaunchBounds()
på den nyskapade bunten.
Observera att som standard, om det redan finns en uppgift för appen på översiktsskärmen, då Android kommer helt enkelt att omdirigera dig till den befintliga (helskärms) uppgiften som tidigare lanserades av användare. Du måste rensa alla uppgifter för appen i Översikt innan du försöker starta appen i ett fritt formatfönster. (För appar med aktiviteter som startar in standard
eller singleTop
lägen kan du tvinga ett nytt fönster att öppnas genom att lägga till Intent.FLAG_ACTIVITY_MULTIPLE_TASK
flagga för avsikten innan du ringer startActivity()
.)
Hur fungerar friformsläget under huven?
Det finns en utmärkt artikel skrivet som förklarar hur multi-window mode, inklusive freeform mode, implementeras i Android Nougat. (OBS: artikeln är skriven på kinesiska, så se till att köra den via Google Translate)
I ett nötskal, appar i fritt format körs i en separat stack från resten av systemet (tänk: virtuellt skrivbord). Därför är det inte möjligt för friformsappar att köras ovanpå startprogrammet eller ovanpå en annan helskärmsapp.
Appar som körs i fritt format (som inte har android: windowIsFloating
satt till sant) har en DecorCaptionView
läggs till som ett barn på toppnivån DecorView
. Denna vy innehåller en LinearLayout
definiera fönstrets bildtextfält för att flytta, maximera och stänga fönstret. Även om jag inte rekommenderar det personligen, är det möjligt att komma åt och anpassa den här vyn genom att få DecorView
använder sig av Window.getDecorView()
, gjuter den till en ViewGroup
och sedan komma åt dess underordnade vyer.
Alla appar som är designade för att fungera bra i Androids standardläge för delad skärm med flera fönster kommer att fungera i fritt format. isInMultiWindowMode()
returnerar sant för appar som körs i fritt format. Det finns några andra offentligt tillgängliga klasser och metoder som en app kan använda som specifikt relaterar till friformsläge:
-
Window.setDecorCaptionShade()
: den här metoden kan användas för att åsidosätta skuggan av bildtextkontrollerna (maximera och stäng-knappen) för appar i fritt format. -
Window.setRestrictedCaptionAreaListener()
: detta kan användas för att upptäcka när ett fönster flyttas runt i fritt format. DeWindow.OnRectrictedCaptionAreaChangedListener
anropas varje gång positionen för bildtextkontrollerna ändras (när en användare flyttar runt fönstret), och ger enRect
med de nya gränserna för bildtextkontrollerna. -
ActivityInfo.WindowLayout
: den här klassen innehåller information som deklareras i appens manifest om den initiala placeringen av ett fritt formatfönster som en app kan begära vid lansering. Till exempel kan du lista följande i tagg för ditt manifest:
Sedan, när enheten redan är i fritt format och appen startas, kommer den att starta med dessa angivna gränser.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Exempel på fönsterläge i fritt format
Sommaren 2016, medan Android Nougat fortfarande var en förhandsvisning av utvecklare, släppte jag en app som heter Aktivitetsfältet som ger en Windows-liknande startmeny och en lista över senaste appar i ett systemöverlägg. Det tillåter användare på Nougat att starta appar i fritt format fönsterläge - och eftersom Aktivitetsfältet använder en överlagring kan den stanna på skärmen i friformsfönstermiljön. Kombinationen av aktivitetsfältet och fritt format ger alla Android-enheter, särskilt surfplattor, en PC-liknande känsla.
Du kan ladda ner Aktivitetsfältet på Google Play, eller se källkoden dig själv på GitHub. Utöver de koncept som nämns i den här artikeln använder jag också några knep för att hålla friformslägesmiljön aktiv även när inga friformsfönster visas på skärmen. Användare kan också valfritt ställa in Aktivitetsfältet som standardstartare för att låta deras enhet starta automatiskt till friformslägesmiljön.
Eftersom det inte finns några enheter som officiellt levereras med friformsfönsterstöd aktiverat av OEM (när detta skrivs), rekommenderar jag använda Aktivitetsfältet som ett verktyg för utvecklare för att testa sina appar i friformsfönstermiljön på enheter som annars inte stöder Det.
Förutom aktivitetsfältet har jag också modifierat Launcher3-källkoden från AOSP för att låta den starta appar i fritt format. Detta är en rak klon av den vanliga Android 7.1.1-startaren, med de minsta ändringar som krävs för att den ska kunna starta appar i fritt format. Jag har tillhandahållit den här modifierade lanseringen i hopp om att andra utvecklare ska implementera stöd för att lansera friformsfönster i sina anpassade startprogram. Du kan se källkoden på GitHub, eller ladda ner ett exempel på APK.
Min förhoppning är att utvecklare av anpassade launchers kan använda den här koden och möjliggöra stöd för att lansera freeform fönsterappar för de användare som önskar större flexibilitet för fönsterhantering på sina stora skärmar enheter.