Android Nougatin vapaamuotoinen ikkunatila: mikä se on ja kuinka kehittäjät voivat käyttää sitä

Vapaamuotoinen usean ikkunan tila on Android Nougatin alikäyttöinen ja aliarvostettu ominaisuus. Selitämme, mikä se on ja kuinka kehittäjät voivat sisällyttää sen.

Vapaamuotoinen ikkunatila, kuten ensin osoitti Ars Technica

Kun Android 7.0 Nougat julkistettiin ensimmäisen kerran vuoden 2016 alussa, se toi Android-alustalle paljon pyydetyn ominaisuuden – usean ikkunan tuen. Useimmat ihmiset ovat tietoisia jaetun näytön usean ikkunan tuesta, joka on oletusarvoisesti käytössä kaikissa Android Nougat -puhelimissa ja -tableteissa. Android Nougatilla varustetut Android TV -laitteet tukevat usean ikkunan kuva kuvassa -tukea.

Android Nougatissa on kuitenkin kolmas usean ikkunan tila, josta harvat ihmiset eivät tiedä: vapaamuotoinen ikkunatila. Tämän tilan avulla Android voi esittää sovelluksia kelluvina ikkunoina, joita käyttäjä voi siirtää ja muuttaa halutessaan. Se on pohjimmiltaan Androidin toteuttama a pinottava ikkunoiden hallinta.

Vuonna Android SDK -dokumentaatio, siinä todetaan, että:

Suurempien laitteiden valmistajat voivat halutessaan ottaa käyttöön vapaamuotoisen tilan, jossa käyttäjä voi vapaasti muuttaa kunkin toiminnon kokoa. Jos valmistaja sallii tämän ominaisuuden, laite tarjoaa vapaamuotoisen tilan jaetun näytön tilan lisäksi.

Ja myös, Android 7.0 CDD:

Laitetoteutukset, joiden näytön koko on xlarge, PITÄÄ tukea vapaamuotoista tilaa.

Tämä osoittaa, että valmistaja voi mahdollisesti ottaa käyttöön vapaamuotoisen ikkunatilan kaikissa uusissa suuren näytön Android-laitteissa, joissa on Android 7.0.

Tämä ei kuitenkaan todellakaan ole kova vaatimus. On mahdollista pakottaa minkä tahansa Android Nougat -laite (jossa kehittäjävaihtoehdot ovat käytössä), joka tukee vapaamuotoista ikkunatilaa jollakin kahdesta eri menetelmästä:


Vapaamuotoisen ikkunatilan ottaminen käyttöön missä tahansa Android Nougat -laitteella

"Pakota aktiviteetit muutettavaksi" -asetuksen käyttöönotto sallii sovellusten toimia vapaamuotoisessa tilassa millä tahansa laitteella

Tapa 1 (adb-tietokone vaaditaan)

Varmista, että USB-virheenkorjaus on otettu käyttöön kehittäjäasetuksissa. Liitä sitten laitteesi tietokoneeseen, johon on asennettu adb, ja suorita seuraava komento:

adb shell settings put global enable_freeform_support 1

Tapa 2 (ei lisävaatimuksia)

Ota käyttöön Kehittäjäasetusten alareunassa oleva Pakota aktiviteetit muuttamaan kokoa.

Molemmat menetelmät vaativat järjestelmän käyttöliittymän uudelleenkäynnistyksen ennen kuin ne voivat tulla voimaan. Helpoin tapa tehdä tämä on käynnistää laite uudelleen (tai jos laitteesi on juurtunut, voit yksinkertaisesti tappaa com.android.systemui käsitellä asiaa)


OK, vapaamuotoinen tila on käytössä… mitä nyt?

Jos otit vapaamuotoisen tilan käyttöön menetelmällä 1, Yleiskatsaus-valikon sovellusmerkinnöissä on uusi painike, joka käynnistää sovelluksen vapaamuotoiseen ikkunatilaan.

Menetelmällä 2 ei kuitenkaan ole mahdollista käynnistää sovellusta vapaamuotoiseen tilaan itse Androidin kautta. Onneksi, mikä tahansa kolmannen osapuolen käynnistysohjelma voi käynnistää sovelluksen vapaamuotoiseen ikkunatilaan käyttämällä tavallisia Android-sovellusliittymiä, jotka on viimeistelty osana API-tasoa 24.

Avain sovelluksen käynnistämiseen vapaamuotoisessa tilassa on soittaa numeroon ActivityOptions.setLaunchBounds() menetelmä. Tämä menetelmä kestää a Rect argumenttina, joka sisältää ikkunan rajat, joilla sovellus käynnistyy.

Tämän jälkeen voit käynnistää sovelluksen startActivity(Intent, Bundle). Jos sinulla ei vielä ole ActivityOptions nippu, voit luoda sellaisen ActivityOptions.makeBasic() ja sitten soittaa setLaunchBounds() juuri luodulla nipulla.

Huomaa, että jos sovellukselle on jo tehtävä Yleiskatsaus-näytössä, oletuksena Android yksinkertaisesti ohjaa sinut olemassa olevaan (koko näytön) tehtävään, jonka käynnisti aiemmin käyttäjä. Sinun on tyhjennettävä kaikki sovelluksen tehtävät Yleiskatsauksessa, ennen kuin yrität käynnistää sovelluksen vapaamuotoiseen ikkunaan. (Sovelluksille, joiden toimintoja käynnistyy standard tai singleTop -tilassa, voit pakottaa uuden ikkunan avautumaan lisäämällä Intent.FLAG_ACTIVITY_MULTIPLE_TASK merkitse tarkoitukseen ennen soittamista startActivity().)


Kuinka vapaamuotoinen tila toimii konepellin alla?

On erinomainen artikkeli kirjoitettu, joka selittää kuinka monen ikkunan tila, mukaan lukien vapaamuotoinen tila, toteutetaan Android Nougatissa. (HUOM: artikkeli on kirjoitettu kiinaksi, joten muista suorittaa se Google-kääntäjän kautta)

Lyhyesti sanottuna vapaamuotoisessa tilassa olevat sovellukset toimivat erillisessä pinossa muusta järjestelmästä (ajattele: virtuaalinen työpöytä). Siksi vapaamuotoiset sovellukset eivät voi toimia käynnistysohjelman tai toisen koko näytön sovelluksen päällä.

Vapaamuotoisessa tilassa toimivat sovellukset (joissa ei ole android: windowIsFloating asetettu tosi) on a DecorCaptionView lisätty huipputason lapsena DecorView. Tämä näkymä sisältää a LinearLayout määrittää ikkunan kuvatekstipalkin ikkunan siirtämistä, maksimoimista ja sulkemista varten. Vaikka en suosittele sitä henkilökohtaisesti, on mahdollista käyttää tätä näkymää ja muokata sitä hankkimalla DecorView käyttämällä Window.getDecorView(), lähettämällä sen a ViewGroup ja sitten pääset sen lapsinäkymiin.

Kaikki sovellukset, jotka on suunniteltu toimimaan hyvin Androidin tavallisessa jaetun näytön moniikkunatilassa, toimivat vapaamuotoisessa tilassa. isInMultiWindowMode() palautuu tosi sovelluksille, jotka toimivat vapaamuotoisessa tilassa. Sovellus voi käyttää muutamia muita julkisesti saatavilla olevia luokkia ja menetelmiä, jotka liittyvät erityisesti vapaamuotoiseen tilaan:

  • Window.setDecorCaptionShade(): tällä menetelmällä voidaan ohittaa kuvatekstisäätimien sävy (suurennus- ja sulkemispainike) sovelluksissa vapaamuotoisessa tilassa.
  • Window.setRestrictedCaptionAreaListener(): tätä voidaan käyttää havaitsemaan, kun ikkunaa liikutetaan vapaamuotoisessa tilassa. The Window.OnRectrictedCaptionAreaChangedListener kutsutaan aina, kun kuvatekstisäätimien sijainti muuttuu (kun käyttäjä siirtää ikkunaa ympäri), ja tarjoaa a Rect kuvatekstisäätimien uusilla rajoilla.
  • ActivityInfo.WindowLayout: tämä luokka sisältää tiedot, jotka on ilmoitettu sovelluksen luettelossa vapaamuotoisen ikkunan alkuperäisestä sijainnista, jota sovellus voi pyytää käynnistyksen yhteydessä. Voit esimerkiksi luetella seuraavat asiat luettelosi tunniste:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Sitten, kun laite on jo vapaamuotoisessa tilassa ja sovellus käynnistetään, se käynnistyy näillä määritetyillä rajoilla.

Esimerkkejä vapaamuotoisesta ikkunatilasta toiminnassa

Tehtäväpalkki lisää aloitusvalikon ja uusimpien sovellusten lokeron täydentämään vapaamuotoista ikkunatilaa

Kesällä 2016, kun Android Nougat oli vielä kehittäjien esikatselu, julkaisin sovelluksen nimeltä Tehtäväpalkki joka tarjoaa Windows-tyyppisen aloitusvalikon ja viimeisimpien sovellusten luettelon järjestelmän peittokuvana. Sen avulla Nougatin käyttäjät voivat käynnistää sovelluksia vapaamuotoisessa ikkunatilassa – ja koska tehtäväpalkki käyttää peittokuvaa, se voi pysyä näytöllä vapaamuotoisessa ikkunaympäristössä. Tehtäväpalkin ja vapaamuotoisen tilan yhdistelmä antaa kaikille Android-laitteille, erityisesti tableteille, PC: n kaltaisen tunnelman.

Sinä pystyt lataa tehtäväpalkki Google Playssa tai katsoa lähdekoodia itsesi GitHubissa. Tässä artikkelissa mainittujen käsitteiden lisäksi käytän myös muutamia temppuja pitääkseni vapaamuotoisen ympäristön aktiivisena, vaikka näytöllä ei olisikaan vapaamuotoisia ikkunoita. Käyttäjät voivat myös valinnaisesti asettaa tehtäväpalkin oletuskäynnistysohjelmakseen, jotta heidän laitteensa käynnistyy automaattisesti vapaamuotoisen tilan ympäristöön.

Koska ei ole laitteita, jotka toimitetaan virallisesti OEM: n sallimalla vapaamuotoisella ikkunatuella (tämän kirjoituksen jälkeen), suosittelen Tehtäväpalkin käyttäminen työkaluna, jonka avulla kehittäjät voivat testata sovelluksiaan vapaamuotoisessa ikkunaympäristössä laitteissa, jotka eivät muuten tue se.

Tehtäväpalkin lisäksi olen myös muokannut AOSP: n Launcher3-lähdekoodia, jotta se voi käynnistää sovelluksia vapaamuotoiseen tilaan. Tämä on suora klooni Android 7.1.1 -kantoraketista, ja siinä on tarvittavat vähimmäismuutokset, jotta se voi käynnistää vapaamuotoisia sovelluksia. Olen toimittanut tämän muokatun käynnistysohjelman siinä toivossa, että muut kehittäjät ottavat käyttöön tuen vapaamuotoisten ikkunoiden käynnistämiselle mukautetuissa käynnistysohjelmissa. Sinä pystyt katsoa lähdekoodia GitHubissa tai lataa malli-APK.

Toivon, että mukautettujen kantorakettien kehittäjät voivat hyödyntää tätä koodia ja mahdollistaa tuen vapaamuotoiselle käynnistämiselle ikkunasovellukset käyttäjille, jotka haluavat suurempaa joustavuutta ikkunoiden hallintaan suuressa näytössä laitteet.