Moniikkuna Android N: ssä: mitä kehittäjien on tiedettävä saadakseen siitä parhaan hyödyn

Tarjoamme yleiskatsauksen siitä, mitä Android N: n tuleva usean ikkunan tuki tarkoittaa kehittäjille ja kuinka saada siitä paras irti!

Usean ikkunan tuki on siisti ominaisuus, jota odotamme Android N: ssä ja olemme halunneet olla saatavilla kaikilla laitteilla jo pitkään. Jotta se olisi nautinnollinen kokemus, kehittäjät saattavat kuitenkin joutua tekemään joitain muutoksia sovelluksiinsa tukeakseen sitä oikein.

Yksi Google I/O -istunnoista oli kehittäjille tarkoitettu oppimaan uusista sovellusliittymistä ja järjestelmän käyttäytymisen muutoksista, joita usean ikkunan tuki tuo mukanaan.

Istunnon esitteli Wale Ogunwale, Android ActivityManagerin tekninen pääjohtaja ja WindowManager-kehyskomponentit – hän ja hänen tiiminsä ovat vastuussa useista ikkunoista Androidissa.

Voit katsoa Usean ikkunan tilan istunto YouTubessa, mutta tarjoamme myös yleiskatsauksen istunnosta täällä.

N esittelee kolme erilaista moniikkunatilaa:
  • Jaetun näytön tila: tämä tila on oletuksena käytettävissä. Kuten nimestä voi päätellä, sen avulla voit avata kaksi sovellusta vierekkäin.
  • Vapaamuotoinen tila: valmistajat voivat ottaa tämän käyttöön suuremmissa laitteissa, jolloin käyttäjät voivat vapaasti muuttaa toimintojen kokoa jaetun näytön tilan lisäksi.
  • Kuva kuvassa -tila: tarkoitettu Android TV -laitteille, tämä tila on tarkoitettu videosoittimille, jotka toimivat kiinnitetyssä ikkunassa käyttäjän ollessa vuorovaikutuksessa muiden sovellusten kanssa.
Android N jaetun näytön tilaAndroid N PiP -tila
Se kannattaa huomioida. Olemme käsitelleet N: n moniikkunaa aiemmin ja kritisoineet nykyistä järjestelmää. Tätä silmällä pitäen toivomme, että vapaamuotoinen tila siirtyy hieman lähemmäksi kuva kuvassa -tilaa, koska sillä olisi hyödyllisiä sovelluksia kaikissa laitteissa.
Usean ikkunan tuen ottaminen käyttöön sovelluksissasi on yksinkertaista: sinun ei tarvitse tehdä mitään, jos kohdistat jo N: ään. Jos haluat poistaa usean ikkunan käytöstä, voit tehdä sen asettamalla android: resizeableActivity manifestissasi oleva aktiviteettimäärite. false. Tämä tulee tehdä vain, jos se on todella perusteltua, koska se saa sovelluksesi erottumaan aina huonosti käynnistyy koko näytön tilassa, vaikka käyttäjä (tai jokin muu sovellus) yrittäisi käynnistää sen useassa ikkunassa -tilassa. On tärkeää huomata, että juuritoiminnon attribuutit koskevat kaikkia sen tehtäväpinon toimintoja. Toisin sanoen, jos sinulla on toimintaa, jonka muut sovellukset voivat käynnistää, varmista, että se tukee usean ikkunan tilaa koska et voi taata, että muut sovellukset käynnistävät toimintasi uudessa tehtävässä käyttämällä. Intent#FLAG_ACTIVITY_NEW_TASK .Kuva kuvassa -tilan tuki on ilmoitettava nimenomaisesti. android: supportsPictureInPicture attribuutti. Huomaa, että tämä määrite ohitetaan, jos. android: resizeableActivity On. false .Layout-attribuutteja voidaan käyttää oletusmittojen ja sijoittelun asettamiseen vapaamuotoisille ikkunoille tai vähimmäisleveyden tai -korkeuden määrittämiseen sekä vapaamuotoisille että jaetuille näytöille:
  • android: defaultWidth/android: defaultHeight: aktiviteetin oletusmitat (vapaamuotoinen tila).
  • android: gravity: toiminnon alkusijainti (vapaamuotoinen tila).
  • android: minimalWidth/android: minimalHeight: toiminnan vähimmäismitat (vapaamuotoiset ja jaetun näytön tilat)
Löydät koodiesimerkin osoitteesta. Googlen Multi-Window Playground -mallisovellus GitHubissa: AndroidManifest.xml.
Usean ikkunan tuen käyttöönoton myötä saatat joutua tarkistamaan muutamia asioita sovelluksissasi varmistaaksesi, että ne toimivat oikein.

Aktiviteetin elinkaaren ymmärtäminen

The. toiminnan elinkaari ei muutu usean ikkunan tilassa: Android Activity Basic -elinkaari Tästä huolimatta jotkut hienovaraiset erot aktiivisuustilojen välillä voivat johtaa tahattomaan toimintaan, jota et normaalisti huomaa ennen N. On tärkeää tietää se. Activity#onResume() ja. Activity#onPause() kutsutaan, kun sovelluksesi tarkennus kasvaa tai menettää, mutta ei välttämättä, kun se alkaa tai lakkaa näkyvistä. (Muista, että vain yksi sovellus voi keskittyä kerrallaan.) Jos sovellus päivittää sisältöä jatkuvasti (esim. videon toisto), muista käsitellä sisällön päivitysten käynnistäminen ja pysäyttäminen. Activity#onStart() ja. Activity#onStop() sen sijaan. Näin ei tehdä esimerkiksi videosovelluksille, tarkoittaa, että toisto tapahtuu vain, jos sovellus on tarkennettu, joka kumoaa usean ikkunan tilan tarkoituksen. Virallisella YouTube-sovelluksella oli samanlainen ongelma, kun Android N Developer Preview käynnistettiin ensimmäisen kerran.

Ajonaikaisten muutosten käsittely

Kun sovellus siirretään usean ikkunan tilaan, jotkin laitteen kokoonpanot muuttuvat. Voit joko sallia toiminnan käynnistymisen uudelleen (tässä tapauksessa. Fragmenttien säilyttäminen saattaa olla hyvä idea, jos toimintosi on suoritettava intensiivinen toimenpide käynnistyksen yhteydessä), tai valitse se. käsittelemään konfiguraatiomuutokset eksplisiittisesti sen sijaan. Neljä laitekokoonpanoa voi muuttua, kun siirryt moniikkunatilaan tai sen sisällä: screenSize, smallestScreenSize, screenLayout ja. orientation. Viittaavat. Android Developers -dokumentaatio saadaksesi lisätietoja kustakin määritteestä, mutta huomioi tämä. orientation ei tarkoita tässä tapauksessa enää laitteen suuntaa. Sen sijaan se vain osoittaa, onko harjoituksesi leveys suurempi kuin sen korkeus (maisema) tai ei (pysty).Voit ilmoittaa, että toimintasi käsittelee nämä muutokset luettelosta:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Muista, että tämä tarkoittaa, että sinun on itse asiassa käsiteltävä nämä muutokset. Activity#onConfigurationChanged(), päivittämällä näkymät manuaalisesti tai lataamalla joitain resursseja uudelleen.

Poistetut ominaisuudet moniikkunatilassa

Toimintasi eivät vaikuta joihinkin järjestelmän ominaisuuksiin usean ikkunan tilassa:
  • Tilapalkin ja navigointipalkin muutoksilla, kuten järjestelmäpalkkien himmennyksellä/piilottamisella tai immersiivisen tilan käyttämisellä, ei ole vaikutusta. Tämä on järkevää, koska toimintasi vie vain osan näytöstä.
  • The android: screenOrientation Activity-attribuutilla ei myöskään ole vaikutusta usean ikkunan tilassa: koska aktiviteettisi kokoa voidaan muuttaa, sillä ei ole enää järkevää olla kiinteää suuntaa.
Uusia takaisinkutsuja on lisätty usean ikkunan tapahtumiin sekä menetelmiä nykyisen tilan kyselyyn.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): kutsutaan, kun toimintatila muuttuu koko näytön tilasta usean ikkunan tilaksi ja päinvastoin.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): kutsutaan, kun toimintatila muuttuu PIP-tilaan/tilasta pois.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): palauttaa, onko toiminto moniikkuna-/kuva kuvassa -tilassa vai ei.
  • Activity#overlayWithDecorCaption(boolean overlay): vapaamuotoisissa ikkunoissa tätä menetelmää voidaan käyttää saamaan kuvateksti (palkki, jolla ikkunaa vedetään ympäriinsä) peittämään sisällön sen sijaan, että sitä painettaisiin alas.
PS. Paitsi. Activity#overlayWithDecorCaption(), nämä menetelmät tarjoavat myös. Fragment luokkaa.

Toimintojen aloittaminen moniikkunatilassa

  • Activity#enterPictureInPictureMode() voidaan käyttää aktiviteetin asettamiseen kuva kuvassa -tilaan. Huomaa, että PiP-tilan toiminnoista ei ilmoiteta syöttötapahtumista – käytä MediaSession#setMediaButtonReceiver() jos haluat hoitaa tällaisia ​​tapahtumia. Muista myös tarkistaa Android Developers -sivusto, jos olet kiinnostunut Kuva kuvassa Android N: llä.
  • Jos laite on jaetun näytön tilassa, voit käskeä järjestelmää käynnistämään toisen toiminnon sinun vieressäsi käyttämällä Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT lippu. Lippu ei vaikuta, jos se ei ole jaetun näytön tilassa.
  • Jos laite on vapaamuotoisessa tilassa, ActivityOptions#setLaunchBounds() voidaan määrittää uuden toiminnon mitat ja sijainti näytöllä.
Katso esimerkkejä koodista Multi-Window Playground -mallisovelluksesta: esimerkki vieressä olevasta toiminnasta, laukaisurajojen esimerkki.

Raahaa ja pudota

Vaikka vedä ja pudota -tuki on ollut käytössä Honeycombista lähtien, se oli aiemmin mahdollista vain samassa toiminnassa. Se on nyt. tuettu useassa ikkunassa yhtä hyvin. Tämän toteuttaminen näyttää olevan. pääosin samat kuin ennenkin, jossa on muutamia lisäyksiä eri toimien vetämällä ja pudottamalla:
  • View#startDragAndDrop()
    • Uusi alias kohteelle View#startDrag().
    • Ota ristiintoiminto käyttöön vetämällä ja pudottamalla ohittamalla uusi lippu View#DRAG_FLAG_GLOBAL.
    • Jos sinun on annettava URI-oikeudet vastaanottajatoiminnalle, välitä uudet liput View#DRAG_FLAG_GLOBAL_URI_READ tai View#DRAG_FLAG_GLOBAL_URI_WRITE, tarvittaessa.
  • View#updateDragShadow()
    • Korvaa vedämisvarjon parhaillaan käynnissä olevalle vetämistoiminnolle. Voidaan kutsua vain sovellus, joka on käynnistänyt vedon.
  • View#cancelDragAndDrop()
    • Peruuttaa parhaillaan käynnissä olevan vetämistoiminnon. Voidaan kutsua vain sovellus, joka on käynnistänyt vedon.
  • Voit tarkistaa, tukeeko laite vapaamuotoista tai kuva kuvassa -tilaa PackageManager#hasSystemFeature(), käyttämällä PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT ja PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE vastaavasti.
  • The android: windowBackground attribuuttia voidaan käyttää taustapiirtokuvana, jos aktiviteetin kokoa muutetaan ja sen renderöinti on jäljessä. Jos android: windowBackground on asettamatta, android: windowBackgroundFallback käytetään sen sijaan. Katso esimerkki Multi-Window Playground -mallisovelluksesta.
Wale tarjosi joitain parhaita käytäntöjä varmistaakseen käyttäjillesi parhaan mahdollisen käyttökokemuksen:
  • Kahvatila vaihtuu tyylikkäästi:
    • Säilytä käyttöliittymän johdonmukaisuus suunnasta riippumatta. Älä anna elementtien vaihtaa paikkaa sujuvan siirtymisen mahdollistamiseksi.
    • Laajenna yllä olevaa, älä vaihda hyvin erilaisten asettelujen välillä puhelimen/tabletin asetteluissa. Mukauta sen sijaan tabletin asettelua pienempiä kokoja varten johdonmukaisuuden vuoksi.
  • Varmista, että toimintasi mukautuu pieniin kokoihin kirjoittaja noudattamalla materiaalisuunnittelun malleja.
  • Käyttää FLAG_ACTIVITY_LAUNCH_ADJACENT kun on järkevää tehdä nautinnollisemmasta kokemuksesta jaetun näytön tilassa.
  • Ilmoita koon muuttamisen yhteensopimattomuudesta vain, jos se on perusteltua. Kuten yllä keskustelimme, sovelluksesi erottuu muuten huonosti.
Wale päätti istunnon tarjoamalla hyödyllisiä lisäresursseja:
  • Usean ikkunan dokumentaatio.
  • Materiaalisuunnittelun ohjeet jaetun näytön tilassa.
  • Esimerkki monen ikkunan sovelluksesta.