Režim Android Nougat Freeform Window: Čo to je a ako ho môžu vývojári využiť

Voľný režim viacerých okien je nedostatočne využívaná a nedocenená funkcia v systéme Android Nougat. Vysvetľujeme, čo to je a ako to môžu vývojári začleniť.

Voľný režim okna, ako to prvýkrát ukázal Ars Technica

Keď bol Android 7.0 Nougat prvýkrát ohlásený začiatkom roku 2016, priniesol so sebou na platformu Android veľmi žiadanú funkciu – podporu viacerých okien. Väčšina ľudí si je vedomá podpory viacerých okien s rozdelenou obrazovkou, ktorá je predvolene povolená na všetkých telefónoch a tabletoch Android Nougat. Zariadenia Android TV so systémom Android Nougat sa dodávajú s podporou pre podporu viacerých okien obrazu v obraze.

V systéme Android Nougat je však prítomný aj tretí režim viacerých okien, o ktorom veľa ľudí nevie: režim voľného okna. Tento režim umožňuje systému Android prezentovať aplikácie ako plávajúce okná, ktoré môže používateľ ľubovoľne presúvať a meniť ich veľkosť. Je to v podstate implementácia systému Android a stohovací správca okien.

V Dokumentácia Android SDK, uvádza, že:

Výrobcovia väčších zariadení sa môžu rozhodnúť povoliť režim voľného tvaru, v ktorom môže používateľ ľubovoľne meniť veľkosť každej aktivity. Ak výrobca túto funkciu povolí, zariadenie ponúka okrem režimu rozdelenej obrazovky aj režim voľného tvaru.

A tiež v Android 7.0 CDD:

Implementácie zariadení s veľkosťou obrazovky xlarge BY MALI podporovať režim voľného tvaru.

To naznačuje, že každé nové zariadenie s Androidom s veľkou obrazovkou, ktoré sa dodáva so systémom Android 7.0, by mohlo mať výrobcom povolený režim voľného okna.

Toto však rozhodne nie je náročná požiadavka. Je možné prinútiť akýkoľvek Zariadenie Android Nougat (s povolenými možnosťami pre vývojárov) na podporu režimu voľného okna pomocou jednej z dvoch rôznych metód:


Povolenie režimu voľného okna na akomkoľvek zariadení Android Nougat

Zapnutie možnosti „Vynútiť zmenu veľkosti aktivít“ umožňuje aplikáciám bežať v režime voľného tvaru na akomkoľvek zariadení

Metóda 1 (vyžaduje sa počítač s adb)

Skontrolujte, či je v Možnostiach vývojára povolené ladenie USB. Potom pripojte svoje zariadenie k počítaču s nainštalovaným adb a vykonajte nasledujúci príkaz:

adb shell settings put global enable_freeform_support 1

Metóda 2 (žiadne ďalšie požiadavky)

Povoľte možnosť „Vynútiť zmenu veľkosti aktivít“ v dolnej časti Možnosti vývojára.

Obe tieto metódy vyžadujú reštartovanie používateľského rozhrania systému predtým, ako sa prejavia. Najjednoduchší spôsob, ako to urobiť, je reštartovať zariadenie (alebo, ak je vaše zariadenie rootované, môžete jednoducho zabiť com.android.systemui proces)


OK, takže režim voľného tvaru je povolený... čo teraz?

Ak ste povolili režim voľného tvaru pomocou metódy 1, pri položkách aplikácie v ponuke Prehľad bude nové tlačidlo na spustenie aplikácie do režimu okna voľného tvaru.

Pri metóde 2 však nie je možné spustiť aplikáciu do voľného režimu prostredníctvom samotného systému Android. Našťastie ľubovoľný spúšťač tretej strany môže spustiť aplikáciu do režimu voľného okna pomocou štandardných rozhraní Android API, ktoré boli dokončené ako súčasť úrovne API 24.

Kľúčom k spusteniu aplikácie v režime voľného tvaru je zavolať na ActivityOptions.setLaunchBounds() metóda. Táto metóda trvá a Rect ako argument, ktorý obsahuje hranice okien, s ktorými sa aplikácia spustí.

Potom môžete aplikáciu spustiť pomocou startActivity(Intent, Bundle). Ak ešte nemáte ActivityOptions balík, môžete si ho vytvoriť pomocou ActivityOptions.makeBasic() a potom zavolať setLaunchBounds() na čerstvo vytvorenom zväzku.

Všimnite si, že v predvolenom nastavení, ak už na obrazovke Prehľad existuje úloha pre aplikáciu, potom Android vás jednoducho presmeruje na existujúcu úlohu (na celú obrazovku), ktorú predtým spustil užívateľ. Pred pokusom o spustenie aplikácie do voľného okna budete musieť vymazať všetky úlohy pre aplikáciu v Prehľade. (Pre aplikácie s aktivitami, ktoré sa spúšťajú v standard alebo singleTop režimov, môžete vynútiť otvorenie nového okna pridaním Intent.FLAG_ACTIVITY_MULTIPLE_TASK pred volaním označte úmysel startActivity().)


Ako funguje režim voľného tvaru pod kapotou?

Existuje výborný článok napísané, ktoré vysvetľuje, ako je v systéme Android Nougat implementovaný režim viacerých okien vrátane režimu voľného tvaru. (POZNÁMKA: článok je napísaný v čínštine, takže si ho nezabudnite spustiť cez Google Translate)

Stručne povedané, aplikácie vo voľnom režime bežia v samostatnom zásobníku od zvyšku systému (napríklad virtuálna plocha). Preto nie je možné, aby aplikácie voľného formátu bežali nad spúšťačom alebo nad inou aplikáciou na celú obrazovku.

Aplikácie spustené vo voľnom režime (ktoré nemajú android: windowIsFloating nastavený na true) mať a DecorCaptionView pridané ako dieťa najvyššej úrovne DecorView. Tento pohľad obsahuje a LinearLayout definovanie lišty titulkov okna na presun, maximalizáciu a zatvorenie okna. Aj keď to osobne neodporúčam, je možné získať prístup k tomuto zobrazeniu a prispôsobiť ho získaním DecorView použitím Window.getDecorView(), odlievaním do a ViewGroup a potom prístup k jeho podradeným zobrazeniam.

Každá aplikácia, ktorá je navrhnutá tak, aby sa správala dobre v štandardnom režime rozdelenej obrazovky s viacerými oknami systému Android, bude fungovať v režime voľného tvaru. isInMultiWindowMode() vráti hodnotu true pre aplikácie spustené v režime voľného tvaru. Existuje niekoľko ďalších verejne dostupných tried a metód, ktoré môže aplikácia použiť a ktoré sa týkajú konkrétne režimu voľného tvaru:

  • Window.setDecorCaptionShade(): túto metódu možno použiť na prepísanie odtieňa ovládacích prvkov titulkov (tlačidlo maximalizácie a zatvorenia) pre aplikácie v režime voľného tvaru.
  • Window.setRestrictedCaptionAreaListener(): toto možno použiť na zistenie pohybu okna v režime voľného tvaru. The Window.OnRectrictedCaptionAreaChangedListener sa volá vždy, keď sa zmení poloha ovládacích prvkov titulkov (keď používateľ pohybuje oknom) a poskytuje a Rect s novými hranicami ovládacích prvkov titulkov.
  • ActivityInfo.WindowLayout: táto trieda obsahuje informácie deklarované v manifeste aplikácie, pokiaľ ide o počiatočné umiestnenie voľného okna, ktoré si môže aplikácia vyžiadať pri spustení. Môžete napríklad uviesť nasledujúce v značka vášho manifestu:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Potom, keď je zariadenie už v režime voľného tvaru a aplikácia je spustená, spustí sa s týmito určenými hranicami.

Príklady režimu voľného okna v akcii

Panel úloh pridáva ponuku Štart a panel s najnovšími aplikáciami, ktoré dopĺňajú režim voľného okna

V lete 2016, keď bol Android Nougat stále ukážkou pre vývojárov, som vydal aplikáciu s názvom Panel úloh ktorý poskytuje ponuku Štart podobnú systému Windows a zoznam nedávnych aplikácií v systémovom prekrytí. Umožňuje používateľom systému Nougat spúšťať aplikácie v režime okna voľného tvaru – a keďže panel úloh používa prekrytie, môže zostať na obrazovke v prostredí okna voľného tvaru. Kombinácia hlavného panela a režimu voľného tvaru dáva každému zariadeniu so systémom Android, najmä tabletom, pocit ako na počítači.

Môžeš stiahnuť Panel úloh na Google Play, príp zobraziť zdrojový kód sami na GitHub. Okrem konceptov spomenutých v tomto článku používam aj niekoľko trikov na udržanie prostredia režimu voľného tvaru aktívne, aj keď sa na obrazovke nezobrazujú žiadne okná voľného tvaru. Používatelia si tiež môžu voliteľne nastaviť panel úloh ako svoj predvolený spúšťač, aby sa ich zariadenie automaticky zaviedlo do prostredia režimu voľného tvaru.

Keďže neexistujú žiadne zariadenia, ktoré by sa oficiálne dodávali s podporou okien voľnej formy povolenou výrobcom OEM (v čase písania tohto textu), odporúčam pomocou panela úloh ako nástroja pre vývojárov na testovanie svojich aplikácií v prostredí okna voľnej formy na zariadeniach, ktoré inak nepodporujú to.

Okrem panela úloh som upravil aj zdrojový kód Launcher3 z AOSP, aby mohol spúšťať aplikácie do režimu voľného tvaru. Toto je priamy klon bežného spúšťača Android 7.1.1 s minimálnymi úpravami potrebnými na spustenie aplikácií voľnej formy. Poskytol som tento upravený spúšťač v nádeji, že ostatní vývojári implementujú podporu pre spúšťanie okien s voľným tvarom vo svojich vlastných spúšťačoch. Môžeš zobraziť zdrojový kód na GitHub, príp stiahnite si vzorový súbor APK.

Dúfam, že vývojári vlastných spúšťačov môžu využiť tento kód a povoliť podporu pre spustenie voľnej formy okenné aplikácie pre tých používateľov, ktorí požadujú väčšiu flexibilitu pri správe okien na ich veľkej obrazovke zariadení.