Android Nougats Freeform Window Mode: Hva det er og hvordan utviklere kan bruke det

Freeform multi-vindusmodus er en underutnyttet og undervurdert funksjon i Android Nougat. Vi forklarer hva det er og hvordan utviklere kan innlemme det.

Freeform-vindusmodus, som først demonstrert av Ars Technica

Da Android 7.0 Nougat først ble kunngjort tidlig i 2016, brakte det med seg en mye etterspurt funksjon til Android-plattformen – støtte for flere vinduer. De fleste er klar over støtte for delt skjerm med flere vinduer som er aktivert som standard på alle Android Nougat-telefoner og -nettbrett. Android TV-enheter med Android Nougat kommer med støtte for bilde-i-bilde-støtte for flere vinduer.

Imidlertid er det en tredje flervindusmodus til stede i Android Nougat som ikke veldig mange er klar over: vindumodus i fritt format. Denne modusen lar Android presentere apper som flytende vinduer som kan flyttes og endres størrelse etter ønske av brukeren. Det er i hovedsak Androids implementering av en stable vindu manager.

I Android SDK-dokumentasjon, står det at:

Produsenter av større enheter kan velge å aktivere friformmodus, der brukeren fritt kan endre størrelsen på hver aktivitet. Hvis produsenten aktiverer denne funksjonen, tilbyr enheten friformmodus i tillegg til delt skjermmodus.

Og også i Android 7.0 CDD:

Enhetsimplementeringer med skjermstørrelse xlarge BØR støtte friformmodus.

Dette indikerer at enhver ny Android-enhet med stor skjerm som leveres med Android 7.0, potensielt kan ha friformsvindumodus aktivert av produsenten.

Dette er imidlertid absolutt ikke et vanskelig krav. Det er mulig å tvinge noen Android Nougat-enhet (med utvikleralternativer aktivert) for å støtte vindumodus i fri form ved å bruke en av to forskjellige metoder:


Aktiverer vindumodus i fritt format på alle Android Nougat-enheter

Ved å slå på alternativet "Tving aktiviteter til å endre størrelse" lar apper kjøre i friformmodus på alle enheter

Metode 1 (en datamaskin med adb kreves)

Sørg for at USB-feilsøking er aktivert i utvikleralternativer. Koble deretter enheten til en datamaskin med adb installert, og kjør følgende kommando:

adb shell settings put global enable_freeform_support 1

Metode 2 (ingen tilleggskrav)

Aktiver alternativet "Tving aktiviteter til å endre størrelse" nederst i Utvikleralternativer.

Begge disse metodene krever at systemgrensesnittet startes på nytt før de kan tre i kraft. Den enkleste måten å gjøre dette på er å starte enheten på nytt (eller, hvis enheten er forankret, kan du ganske enkelt drepe com.android.systemui prosess)


OK, så friformmodus er aktivert... hva nå?

Hvis du aktivert friformmodus ved hjelp av metode 1, vil det være en ny knapp på appoppføringer i Oversikt-menyen for å starte en app i friformvindumodus.

Med metode 2 er det imidlertid ikke mulig å starte en app i friformmodus gjennom selve Android. Heldigvis, det er mulig for enhver tredjeparts launcher å starte en app i friformsvindumodus ved å bruke standard Android APIer som ble ferdigstilt som en del av API-nivå 24.

Nøkkelen til å starte en app i friformmodus er å ringe ActivityOptions.setLaunchBounds() metode. Denne metoden tar en Rect som et argument, som inneholder vindusgrensene som appen vil starte med.

Du kan da starte appen med startActivity(Intent, Bundle). Hvis du ikke allerede har en ActivityOptions pakke, kan du lage en med ActivityOptions.makeBasic() og så ringer setLaunchBounds() på den nylagde bunten.

Merk at som standard, hvis det allerede er en oppgave for appen på Oversikt-skjermen, så Android vil ganske enkelt omdirigere deg til den eksisterende (fullskjerm) oppgaven som tidligere ble lansert av bruker. Du må fjerne alle oppgaver for appen i Oversikt før du prøver å starte appen i et vindu med fri form. (For apper med aktiviteter som starter i standard eller singleTop moduser, kan du tvinge et nytt vindu til å åpne ved å legge til Intent.FLAG_ACTIVITY_MULTIPLE_TASK flagg til intensjonen før du ringer startActivity().)


Hvordan fungerer friformmodus under panseret?

Det er en utmerket artikkel skrevet som forklarer hvordan flervindusmodus, inkludert friformmodus, er implementert i Android Nougat. (MERK: artikkelen er skrevet på kinesisk, så sørg for å kjøre den gjennom Google Translate)

I et nøtteskall kjører apper i friformmodus i en separat stabel fra resten av systemet (tenk: virtuelt skrivebord). Derfor er det ikke mulig for freeform-apper å kjøre på toppen av starteren eller på toppen av en annen fullskjerm-app.

Apper som kjører i friformmodus (som ikke har android: windowIsFloating satt til sann) har en DecorCaptionView lagt til som et barn av toppnivået DecorView. Denne visningen inneholder en LinearLayout definere vinduets bildetekstlinje for å flytte, maksimere og lukke vinduet. Selv om jeg ikke anbefaler det personlig, er det mulig å få tilgang til og tilpasse denne visningen ved å få DecorView ved hjelp av Window.getDecorView(), kaster den til en ViewGroup og deretter få tilgang til underordnede visninger.

Enhver app som er designet for å oppføre seg bra i Androids standard flervindusmodus med delt skjerm, vil fungere i friformmodus. isInMultiWindowMode() vil returnere sann for apper som kjører i friformmodus. Det er noen få andre offentlig tilgjengelige klasser og metoder som en app kan bruke som spesifikt er relatert til friformmodus:

  • Window.setDecorCaptionShade(): denne metoden kan brukes til å overstyre skyggen av bildetekstkontrollene (maksimer og lukk-knappen) for apper i friformmodus.
  • Window.setRestrictedCaptionAreaListener(): dette kan brukes til å oppdage når et vindu flyttes rundt i friformmodus. De Window.OnRectrictedCaptionAreaChangedListener kalles opp hver gang posisjonen til bildetekstkontrollene endres (når en bruker flytter vinduet rundt), og gir en Rect med de nye grensene for bildetekstkontrollene.
  • ActivityInfo.WindowLayout: denne klassen inneholder informasjon som er deklarert i appens manifest om den opprinnelige plasseringen av et vindu i friform som en app kan be om ved lansering. For eksempel kan du liste opp følgende i tag for manifestet ditt:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Deretter, når enheten allerede er i friformmodus og appen er lansert, vil den starte med disse spesifiserte grensene.

Eksempler på vindumodus i fritt format i aksjon

Oppgavelinjen legger til en startmeny og brett for nylige apper for å komplimentere vindumodus i friform

Sommeren 2016, mens Android Nougat fortsatt var en forhåndsvisning for utviklere, ga jeg ut en app kalt Oppgavelinje som gir en Windows-lignende startmeny og nylig appliste i et systemoverlegg. Det lar brukere på Nougat starte apper i friformsvindumodus - og siden oppgavelinjen bruker et overlegg, kan den forbli på skjermen i friformsvindusmiljøet. Kombinasjonen av oppgavelinje og friformmodus gir enhver Android-enhet, spesielt nettbrett, en PC-lignende følelse.

Du kan last ned oppgavelinjen på Google Play, eller se kildekoden deg selv på GitHub. I tillegg til konseptene nevnt i denne artikkelen, bruker jeg også noen få triks for å holde friformmodus-miljøet aktivt selv når ingen friformsvinduer vises på skjermen. Brukere kan også valgfritt angi oppgavelinjen som standardstarter for å la enheten starte automatisk til friformmodusmiljøet.

Siden det ikke er noen enheter som offisielt leveres med friformvindustøtte aktivert av OEM (i skrivende stund), anbefaler jeg bruke oppgavelinjen som et verktøy for utviklere for å teste appene sine i friformsvindumiljøet på enheter som ellers ikke støtter den.

I tillegg til oppgavelinjen har jeg også modifisert Launcher3-kildekoden fra AOSP for å la den starte apper i friformmodus. Dette er en rett klone av Android 7.1.1-lanseringsprogrammet, med det minste nødvendige modifikasjoner for å tillate den å starte friform-apper. Jeg har gitt denne modifiserte lanseringen i håp om at andre utviklere vil implementere støtte for å lansere friformvinduer i deres egendefinerte lanseringer. Du kan se kildekoden på GitHub, eller last ned en prøve-APK.

Mitt håp er at utviklere av tilpassede lanseringer kan bruke denne koden og aktivere støtte for lansering av freeform vindusapper for de brukerne som ønsker større fleksibilitet for vindusadministrasjon på sine store skjermer enheter.