Freeform multi-window mode er en underudnyttet og undervurderet funktion i Android Nougat. Vi forklarer, hvad det er, og hvordan udviklere kan inkorporere det.
Da Android 7.0 Nougat først blev annonceret tidligt i 2016, bragte det en meget efterspurgt funktion til Android-platformen - multi-vindue-understøttelse. De fleste mennesker er opmærksomme på den opdelte skærm med flere vinduer, der er aktiveret som standard på alle Android Nougat-telefoner og -tablets. Android TV-enheder med Android Nougat kommer med understøttelse af billed-i-billede multi-vindue-understøttelse.
Der er dog en tredje multi-vindue-tilstand til stede i Android Nougat, som ikke ret mange mennesker er klar over: freeform vinduestilstand. Denne tilstand giver Android mulighed for at præsentere apps som flydende vinduer, der kan flyttes og tilpasses efter eget ønske af brugeren. Det er i bund og grund Androids implementering af en stable vinduesmanager.
I Android SDK-dokumentation, står der, at:
Producenter af større enheder kan vælge at aktivere freeform mode, hvor brugeren frit kan ændre størrelsen på hver aktivitet. Hvis producenten aktiverer denne funktion, tilbyder enheden freeform-tilstand ud over split-screen-tilstand.
Og også i Android 7.0 CDD:
Enhedsimplementeringer med skærmstørrelse xlarge SKAL understøtte freeform mode.
Dette indikerer, at enhver ny Android-enhed med stor skærm, der leveres med Android 7.0, potentielt kan have freeform vinduestilstand aktiveret af producenten.
Dette er dog absolut ikke et hårdt krav. Det er muligt at tvinge nogen Android Nougat-enhed (med udviklerindstillinger aktiveret) til at understøtte friformsvinduetilstand ved hjælp af en af to forskellige metoder:
Aktiverer freeform vinduestilstand på enhver Android Nougat-enhed
Metode 1 (en computer med adb er påkrævet)
Sørg for, at USB-fejlretning er aktiveret i Udviklerindstillinger. Tilslut derefter din enhed til en computer med adb installeret, og udfør følgende kommando:
adb shell settings put global enable_freeform_support 1
Metode 2 (ingen yderligere krav)
Aktiver indstillingen "Tving aktiviteter til at ændre størrelse" nederst i Udviklerindstillinger.
Begge disse metoder kræver, at systembrugergrænsefladen genstartes, før de kan træde i kraft. Den nemmeste måde at gøre dette på er at genstarte din enhed (eller, hvis din enhed er rootet, kan du simpelthen dræbe com.android.systemui
behandle)
OK, så freeform mode er aktiveret... hvad nu?
Hvis du aktiverede friformstilstand ved hjælp af metode 1, vil der være en ny knap på appindgange i oversigtsmenuen for at starte en app i friformsvinduetilstand.
Med metode 2 er det dog ikke muligt at starte en app i frit format gennem selve Android. Heldigvis, det er muligt for enhver tredjeparts launcher at starte en app i frit vinduestilstand ved at bruge standard Android API'er, der blev færdiggjort som en del af API niveau 24.
Nøglen til at starte en app i freeform-tilstand er at ringe til ActivityOptions.setLaunchBounds()
metode. Denne metode tager en Rect
som et argument, der indeholder de vinduesgrænser, som appen vil starte med.
Du kan derefter starte appen med startActivity(Intent, Bundle)
. Hvis du ikke allerede har en ActivityOptions
bundt, du kan oprette en med ActivityOptions.makeBasic()
og så ringer setLaunchBounds()
på det nyskabte bundt.
Bemærk, at hvis der allerede er en opgave til appen på Oversigtsskærmen, så Android vil blot omdirigere dig til den eksisterende (fuldskærm) opgave, der tidligere blev lanceret af bruger. Du skal rydde eventuelle opgaver for appen i Oversigt, før du forsøger at starte appen i et frit vindue. (For apps med aktiviteter, der starter i standard
eller singleTop
tilstande, kan du tvinge et nyt vindue til at åbne ved at tilføje Intent.FLAG_ACTIVITY_MULTIPLE_TASK
flag til hensigten, før du ringer startActivity()
.)
Hvordan fungerer friformstilstand under hætten?
Der er en fremragende artikel skrevet, der forklarer, hvordan multi-window mode, inklusive freeform mode, er implementeret i Android Nougat. (BEMÆRK: artiklen er skrevet på kinesisk, så sørg for at køre den gennem Google Translate)
I en nøddeskal kører apps i freeform-tilstand i en separat stak fra resten af systemet (tænk: virtuelt skrivebord). Derfor er det ikke muligt for freeform-apps at køre oven på launcheren eller oven på en anden fuldskærms-app.
Apps, der kører i frit format (som ikke har android: windowIsFloating
sat til sand) har en DecorCaptionView
tilføjet som et barn af det øverste niveau DecorView
. Denne visning indeholder en LinearLayout
definere vinduets billedtekstlinje til at flytte, maksimere og lukke vinduet. Selvom jeg ikke anbefaler det personligt, er det muligt at få adgang til og tilpasse denne visning ved at få DecorView
ved brug af Window.getDecorView()
, støbte det til en ViewGroup
og derefter få adgang til dens underordnede synspunkter.
Enhver app, der er designet til at opføre sig godt i Androids standard multi-vindue-tilstand med delt skærm, fungerer i friformstilstand. isInMultiWindowMode()
vil returnere sandt for apps, der kører i frit format. Der er et par andre offentligt tilgængelige klasser og metoder, som en app kan bruge, der specifikt relaterer sig til friformstilstand:
-
Window.setDecorCaptionShade()
: denne metode kan bruges til at tilsidesætte skyggen af billedtekstkontrollerne (maksimer og luk-knappen) for apps i frit format. -
Window.setRestrictedCaptionAreaListener()
: dette kan bruges til at registrere, når et vindue flyttes rundt i frit format. DetWindow.OnRectrictedCaptionAreaChangedListener
kaldes hver gang positionen af billedtekstkontrollerne ændres (når en bruger flytter vinduet rundt), og giver enRect
med de nye grænser for billedtekstkontrollerne. -
ActivityInfo.WindowLayout
: denne klasse indeholder oplysninger erklæret i appens manifest om den indledende placering af et frit vindue, som en app kan anmode om ved lancering. For eksempel kan du angive følgende i tag på dit manifest:
Derefter, når enheden allerede er i friformstilstand, og appen er lanceret, starter den med disse angivne grænser.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Eksempler på freeform vinduestilstand i aktion
I sommeren 2016, mens Android Nougat stadig var en forhåndsvisning af udviklere, udgav jeg en app kaldet Proceslinje der giver en Windows-lignende startmenu og en liste over seneste apps i et systemoverlay. Det giver brugere på Nougat mulighed for at starte apps i frit-vindue-tilstand - og da proceslinjen bruger en overlejring, kan den forblive på skærmen i frit-vindue-miljøet. Kombinationen af proceslinje og freeform-tilstand giver enhver Android-enhed, især tablets, en pc-lignende følelse.
Du kan download proceslinjen på Google Play, eller se kildekoden dig selv på GitHub. Ud over de begreber, der er nævnt i denne artikel, bruger jeg også et par tricks til at holde friformstilstandsmiljøet aktivt, selv når der ikke vises freeform-vinduer på skærmen. Brugere kan også valgfrit indstille proceslinjen som deres standardstarter for at tillade deres enhed at starte automatisk til friformstilstandsmiljøet.
Da der ikke er nogen enheder, der officielt leveres med freeform-vindue-understøttelse aktiveret af OEM (i skrivende stund), anbefaler jeg ved at bruge proceslinjen som et værktøj for udviklere til at teste deres apps i det frie vinduesmiljø på enheder, der ellers ikke understøtter det.
Ud over proceslinjen har jeg også ændret Launcher3-kildekoden fra AOSP for at give den mulighed for at starte apps i freeform-tilstand. Dette er en lige klon af den almindelige Android 7.1.1 launcher, med de nødvendige minimumsændringer for at tillade den at starte freeform apps. Jeg har leveret denne modificerede launcher i håbet om, at andre udviklere vil implementere support til lancering af freeform-vinduer i deres brugerdefinerede launchers. Du kan se kildekoden på GitHub, eller download en prøve APK.
Mit håb er, at udviklere af brugerdefinerede launchers kan bruge denne kode og aktivere support til at lancere freeform vinduesapps til de brugere, der ønsker større fleksibilitet til vinduesstyring på deres store skærme enheder.