Multi-Window in Android N: wat ontwikkelaars moeten weten om er het beste van te maken

click fraud protection

We geven een overzicht van wat de komende ondersteuning voor meerdere vensters in Android N voor ontwikkelaars betekent, en hoe je er het beste uit kunt halen!

Ondersteuning voor meerdere vensters is een leuke functie waar we op wachten in Android N eentje die we al heel lang op alle apparaten beschikbaar wilden hebben. Om het een plezierige ervaring te laten zijn, moeten ontwikkelaars mogelijk enkele wijzigingen in hun apps aanbrengen om deze correct te ondersteunen.

Een van de Google I/O-sessies was bedoeld om ontwikkelaars te leren over de nieuwe API's en systeemgedragsveranderingen die ondersteuning voor meerdere vensters met zich meebrengt.

De sessie werd gepresenteerd door Wale Ogunwale, de Technical Lead Manager voor de Android ActivityManager en WindowManager-frameworkcomponenten -- hij en zijn team zijn verantwoordelijk voor multi-window op Android.

Je kunt kijken naar de Sessie in Multi-Window-modus op YouTube, maar we geven hier ook een overzicht van de sessie.

N introduceert drie verschillende modi met meerdere vensters:
  • Modus voor gesplitst scherm: dit is de modus die standaard beschikbaar is. Zoals de naam al aangeeft, kunt u hiermee twee applicaties naast elkaar openen.
  • Freeform-modus: fabrikanten kunnen dit inschakelen op grotere apparaten, waardoor gebruikers naast de gesplitste schermmodus de grootte van activiteiten vrij kunnen aanpassen.
  • Beeld-in-beeld-modus: gericht op Android TV-apparaten, deze modus is bedoeld voor videospelers die in een vastgezet venster kunnen worden uitgevoerd terwijl de gebruiker met andere applicaties communiceert.
Android N-modus met gesplitst schermAndroid N PiP-modus
Het is de moeite waard om dat op te merken. we hebben al eerder over meerdere vensters op N gesproken en enige kritiek geuit op het huidige systeem. Met dat in gedachten hopen we dat de freeform-modus een beetje dichter bij de picture-in-picture-modus komt, omdat dat op alle apparaten nuttige toepassingen zou hebben.
Het inschakelen van ondersteuning voor meerdere vensters in uw apps is eenvoudig: u hoeft niets te doen als u al N target. Mocht u ervoor kiezen om meerdere vensters uit te schakelen, dan kunt u dit doen door de. android: resizeableActivity activiteitskenmerk in uw manifest aan. false. Dit moet alleen worden gedaan als dit echt gerechtvaardigd is, omdat uw app hierdoor altijd op een slechte manier opvalt starten in de modus Volledig scherm, zelfs als de gebruiker (of een andere app) deze in meerdere vensters probeert te starten modus. Het is belangrijk op te merken dat de kenmerken van een hoofdactiviteit van toepassing zijn op alle activiteiten binnen de takenstapel. Met andere woorden: als u een activiteit heeft die door andere apps kan worden gestart, zorg er dan voor dat deze de modus voor meerdere vensters ondersteunt omdat u niet kunt garanderen dat andere apps uw activiteit in een nieuwe taak zullen starten met behulp van. Intent#FLAG_ACTIVITY_NEW_TASK Ondersteuning voor de Picture-in-Picture-modus moet expliciet worden aangegeven via de. android: supportsPictureInPicture attribuut. Houd er rekening mee dat dit kenmerk wordt genegeerd als. android: resizeableActivity is. false .Layout-attributen kunnen worden gebruikt om de standaardafmetingen en plaatsing voor vrije-vormvensters in te stellen, of om een ​​minimale breedte of hoogte op te geven voor zowel vrije-vorm- als gesplitste schermmodi:
  • android: defaultWidth/android: defaultHeight: de standaardafmetingen van de activiteit (vrije vormmodus).
  • android: gravity: de beginpositie van de activiteit (vrije vormmodus).
  • android: minimalWidth/android: minimalHeight: de minimale afmetingen van de activiteit (freeform- en split-screen-modi)
Een codevoorbeeld vindt u in. Voorbeeld-app Multi-Window Playground van Google op GitHub: AndroidManifest.xml.
Met de introductie van ondersteuning voor meerdere vensters moet u mogelijk een paar dingen in uw apps dubbel controleren om er zeker van te zijn dat ze correct werken.

Inzicht in de levenscyclus van een activiteit

De. levenscyclus van activiteiten blijft ongewijzigd in de modus met meerdere vensters: Basislevenscyclus van Android-activiteit Dat gezegd hebbende, kunnen sommige subtiele verschillen tussen de activiteitstoestanden resulteren in onbedoeld gedrag dat je normaal gesproken niet zou opmerken voordat N. Het is belangrijk om dat te weten. Activity#onResume() En. Activity#onPause() worden aangeroepen wanneer uw app de focus krijgt of verliest, maar niet noodzakelijkerwijs wanneer deze zichtbaar wordt of niet meer zichtbaar is. (Houd er rekening mee dat er op een bepaald moment slechts één app focus kan hebben.) Voor apps die de inhoud voortdurend bijwerken (bijvoorbeeld het afspelen van video's), moet u ervoor zorgen dat u het starten en stoppen van inhoudsupdates afhandelt. Activity#onStart() En. Activity#onStop() in plaats van. Dit doe je bijvoorbeeld niet voor video-apps, betekent dat het afspelen alleen plaatsvindt als de app is scherpgesteld, wat het doel van de modus met meerdere vensters tenietdoet. De officiële YouTube-app had een soortgelijk probleem toen de Android N Developer Preview voor het eerst werd gelanceerd.

Runtimewijzigingen verwerken

Wanneer een app in de modus voor meerdere vensters wordt gezet, zullen sommige apparaatconfiguraties veranderen. U kunt toestaan ​​dat uw activiteit opnieuw wordt opgestart (in dat geval. fragmenten vasthouden kan een goed idee zijn als uw activiteit bij het opstarten een intensieve operatie moet uitvoeren), of kies ervoor om dat te doen. de configuratiewijzigingen expliciet afhandelen in plaats van. Vier apparaatconfiguraties kunnen veranderen wanneer u naar de modus met meerdere vensters gaat: screenSize, smallestScreenSize, screenLayout En. orientation. Verwijs naar de. Documentatie voor Android-ontwikkelaars voor meer informatie over elk kenmerk, maar let op. orientation verwijst in dit geval niet langer naar de oriëntatie van het apparaat. In plaats daarvan geeft het alleen aan of de breedte van uw activiteit groter is dan de hoogte (liggend) of niet (staand). Verklaren dat uw activiteit deze wijzigingen aankan, kunt u doen vanuit het manifest:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Houd er rekening mee dat dit betekent dat u deze wijzigingen daadwerkelijk moet verwerken. Activity#onConfigurationChanged(), door weergaven handmatig bij te werken of bepaalde bronnen opnieuw te laden.

Uitgeschakelde functies in Multi-Window-modus

Sommige systeemfuncties worden niet beïnvloed door uw activiteiten in de modus met meerdere vensters:
  • Wijzigingen in de statusbalk en navigatiebalk, zoals het dimmen/verbergen van de systeembalken of het gebruik van de meeslepende modus, hebben geen effect. Dit is logisch omdat uw activiteit slechts een deel van het scherm beslaat.
  • De android: screenOrientation Het activiteitsattribuut heeft ook geen effect in de modus met meerdere vensters: aangezien de grootte van uw activiteit kan worden aangepast, is het niet langer logisch dat deze een vaste oriëntatie heeft.
Er zijn nieuwe callbacks toegevoegd voor gebeurtenissen met meerdere vensters, evenals methoden om de huidige status op te vragen.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): aangeroepen wanneer de activiteitsstatus verandert van volledig scherm naar meerdere vensters en omgekeerd.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): aangeroepen wanneer de activiteitsstatus verandert van/naar de PIP-modus.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): geeft terug of de activiteit zich in de modus voor meerdere vensters/beeld-in-beeld bevindt of niet.
  • Activity#overlayWithDecorCaption(boolean overlay): voor vensters met vrije vorm kan deze methode worden gebruikt om het bijschrift (de balk die wordt gebruikt om het venster rond te slepen) over de inhoud te laten heenkomen in plaats van deze naar beneden te duwen.
PS. Behalve voor. Activity#overlayWithDecorCaption(), deze methoden worden ook aangeboden door de. Fragment klas.

Activiteiten starten in Multi-Window-modus

  • Activity#enterPictureInPictureMode() kan worden gebruikt om een ​​activiteit in beeld-in-beeldmodus te zetten. Houd er rekening mee dat activiteiten in de PiP-modus geen melding krijgen over invoergebeurtenissen - gebruik MediaSession#setMediaButtonReceiver() als u dergelijke evenementen wilt afhandelen. Zorg ervoor dat u ook de Android Developers-website bezoekt als u hierin geïnteresseerd bent Beeld-in-beeld op Android N.
  • Als het apparaat zich in de modus voor gesplitst scherm bevindt, kunt u het systeem vertellen een andere activiteit naast de uwe te starten door gebruik te maken van de Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT vlag. De vlag heeft geen effect als deze niet in de gesplitste schermmodus staat.
  • Als het apparaat zich in de vrijevormmodus bevindt, ActivityOptions#setLaunchBounds() kan worden gebruikt om de afmetingen en locatie van de nieuwe activiteit op het scherm te specificeren.
Bekijk voor codevoorbeelden de voorbeeld-app Multi-Window Playground: naastgelegen activiteitenvoorbeeld, voorbeeld van lanceergrenzen.

Slepen en neerzetten

Hoewel ondersteuning via slepen en neerzetten al bestaat sinds Honeycomb, was dit voorheen alleen mogelijk binnen dezelfde activiteit. Het is nu. ondersteund in meerdere vensters ook. Het lijkt erop dat dit in de praktijk wordt gebracht. grotendeels hetzelfde als voorheen, met een paar toevoegingen voor slepen en neerzetten tussen activiteiten:
  • View#startDragAndDrop()
    • Nieuwe alias voor View#startDrag().
    • Om cross-activiteit slepen en neerzetten in te schakelen, geeft u de nieuwe vlag door View#DRAG_FLAG_GLOBAL.
    • Als u URI-machtigingen moet geven aan de activiteit van de ontvanger, geeft u de nieuwe vlaggen door View#DRAG_FLAG_GLOBAL_URI_READ of View#DRAG_FLAG_GLOBAL_URI_WRITE, naar gelang het geval.
  • View#updateDragShadow()
    • Vervangt de sleepschaduw voor een sleepbewerking die momenteel wordt uitgevoerd. Kan alleen worden aangeroepen door de app die de sleepbewerking heeft uitgevoerd.
  • View#cancelDragAndDrop()
    • Annuleert een sleepbewerking die momenteel wordt uitgevoerd. Kan alleen worden aangeroepen door de app die de sleepbewerking heeft uitgevoerd.
  • Controleren of een apparaat freeform- of picture-in-picture-modi ondersteunt, is mogelijk via PackageManager#hasSystemFeature(), gebruik makend van PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT En PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE respectievelijk.
  • De android: windowBackground attribuut kan worden gebruikt als tekenbare achtergrond, als de grootte van de activiteit wordt gewijzigd en de weergave ervan achterblijft. Als android: windowBackground is uitgeschakeld, android: windowBackgroundFallback wordt in plaats daarvan gebruikt. Raadpleeg de voorbeeldapp Multi-Window Playground voor een voorbeeld.
Wale heeft een aantal praktische tips gegeven om ervoor te zorgen dat uw gebruikers de best mogelijke ervaring hebben:
  • De behandelmodus verandert elegant:
    • Behoud de consistentie van de gebruikersinterface, ongeacht de oriëntatie. Zorg ervoor dat elementen niet van positie veranderen om vloeiende overgangen mogelijk te maken.
    • Als aanvulling op het bovenstaande, schakel niet tussen zeer verschillende lay-outs voor telefoon-/tabletlay-outs. Pas in plaats daarvan de tabletindeling aan voor kleinere formaten voor consistentie.
  • Zorg ervoor dat uw activiteiten zich aanpassen aan kleine afmetingen door volgens de Material Design-patronen.
  • Gebruik FLAG_ACTIVITY_LAUNCH_ADJACENT wanneer het zinvol is om voor een aangenamere ervaring te zorgen in de gesplitste schermmodus.
  • Verklaar alleen incompatibiliteit met het wijzigen van de grootte als dit gerechtvaardigd is. Zoals we hierboven hebben besproken, zorgt het ervoor dat uw app anders op een slechte manier opvalt.
Wale beëindigde de sessie met enkele aanvullende nuttige bronnen:
  • Documentatie met meerdere vensters.
  • Richtlijnen voor materiaalontwerp voor de modus voor gesplitst scherm.
  • Voorbeeld van een app met meerdere vensters.