Multi-fenêtres dans Android N: ce que les développeurs doivent savoir pour en tirer le meilleur parti

Nous fournissons un aperçu de ce que la prochaine prise en charge multi-fenêtres dans Android N signifie pour les développeurs et comment en tirer le meilleur parti !

La prise en charge de plusieurs fenêtres est une fonctionnalité intéressante que nous attendons dans Android N, et celui que nous voulions depuis longtemps être disponible sur tous les appareils. Cependant, pour que ce soit une expérience agréable, les développeurs devront peut-être apporter quelques modifications à leurs applications pour la prendre en charge correctement.

L'une des sessions Google I/O était destinée aux développeurs pour en savoir plus sur les nouvelles API et les changements de comportement du système apportés par la prise en charge multi-fenêtres.

La session a été présentée par Wale Ogunwale, responsable technique d'Android ActivityManager et Composants du framework WindowManager: lui et son équipe sont responsables du multi-fenêtre sur Android.

Vous pouvez regarder le Session en mode multi-fenêtres sur YouTube, mais nous fournissons également un aperçu de la session ici.

N introduit trois modes multi-fenêtres différents:
  • Mode écran partagé: c'est le mode disponible par défaut. Comme son nom l'indique, il vous permet d'ouvrir deux applications côte à côte.
  • Mode forme libre: les fabricants peuvent l'activer sur des appareils plus grands, ce qui permet aux utilisateurs de redimensionner librement leurs activités en plus du mode écran partagé.
  • Mode image dans l'image: destiné aux appareils Android TV, ce mode est destiné aux lecteurs vidéo pour fonctionner dans une fenêtre épinglée pendant que l'utilisateur interagit avec d'autres applications.
Mode écran partagé Android NMode PiP Android N
Cela vaut la peine de le noter. nous avons déjà abordé le multi-fenêtre sur N et avons formulé quelques critiques sur le système actuel. Dans cet esprit, nous espérons que le mode libre se rapprochera un peu du mode image dans l’image, car cela aurait des applications utiles sur tous les appareils.
L'activation de la prise en charge multi-fenêtres dans vos applications est simple: vous n'avez rien à faire si vous ciblez déjà N. Si vous choisissez de désactiver le multi-fenêtre, vous pouvez le faire en définissant le. android: resizeableActivity attribut d'activité dans votre manifeste. false. Cela ne devrait être fait que si cela est vraiment justifié, car cela fait que votre application se démarque toujours d'une mauvaise manière. lancement en mode plein écran même si l'utilisateur (ou une autre application) tente de le lancer en multi-fenêtre mode. Il est important de noter que les attributs d'une activité racine s'appliquent à toutes les activités de sa pile de tâches. En d'autres termes, si vous avez une activité qui peut être démarrée par d'autres applications, assurez-vous qu'elle prend en charge le mode multi-fenêtre. car vous ne pouvez pas garantir que d'autres applications lanceront votre activité dans une nouvelle tâche en utilisant. Intent#FLAG_ACTIVITY_NEW_TASK .La prise en charge du mode Picture-in-picture doit être déclarée explicitement via le. android: supportsPictureInPicture attribut. Notez que cet attribut est ignoré si. android: resizeableActivity est. false Les attributs .Layout peuvent être utilisés pour définir les dimensions et le placement par défaut des fenêtres de forme libre, ou pour spécifier une largeur ou une hauteur minimale pour les modes de forme libre et d'écran partagé:
  • android: defaultWidth/android: defaultHeight: les dimensions par défaut de l'activité (mode forme libre).
  • android: gravity: la position initiale de l'activité (mode forme libre).
  • android: minimalWidth/android: minimalHeight: les dimensions minimales de l'activité (modes forme libre et écran partagé)
Vous pouvez trouver un exemple de code dans. Exemple d'application Multi-Window Playground de Google sur GitHub: AndroidManifest.xml.
Avec l'introduction de la prise en charge de plusieurs fenêtres, vous devrez peut-être vérifier quelques éléments dans vos applications pour vous assurer qu'elles fonctionnent correctement.

Comprendre le cycle de vie de l'activité

Le. cycle de vie de l'activité est inchangé en mode multi-fenêtre: Cycle de vie de base de l'activité Android Cela étant dit, certaines différences subtiles entre les états d'activité peuvent entraîner un comportement involontaire que vous ne remarqueriez normalement pas avant N. C'est important de le savoir. Activity#onResume() et. Activity#onPause() sont appelés lorsque votre application gagne ou perd le focus, mais pas nécessairement lorsqu'elle commence ou cesse d'être visible. (N'oubliez pas qu'une seule application peut avoir le focus à un moment donné.) Pour les applications qui mettent constamment à jour le contenu (par exemple, la lecture vidéo), assurez-vous de gérer le démarrage et l'arrêt des mises à jour du contenu. Activity#onStart() et. Activity#onStop() plutôt. Ne le faites pas pour les applications vidéo, par exemple, signifiera que la lecture n'aura lieu que si l'application est ciblée, ce qui va à l'encontre de l'objectif du mode multi-fenêtres. L'application YouTube officielle a rencontré un problème similaire lors du premier lancement d'Android N Developer Preview..

Gestion des modifications d'exécution

Lorsqu'une application est mise en mode multi-fenêtres, certaines configurations de l'appareil changent. Vous pouvez soit autoriser le redémarrage de votre activité (auquel cas. conserver des fragments peut être une bonne idée, si votre activité doit effectuer une opération intensive au démarrage), ou choisir de le faire. gérer explicitement les modifications de configuration plutôt. Quatre configurations d'appareil peuvent changer lors de l'entrée ou à l'intérieur du mode multi-fenêtre: screenSize, smallestScreenSize, screenLayout et. orientation. Se référer au. Documentation pour les développeurs Android pour plus d'informations sur chaque attribut, mais notez-le. orientation ne fait plus référence à l'orientation de l'appareil dans ce cas. Au lieu de cela, il indique simplement si la largeur de votre activité est supérieure à sa hauteur (paysage) ou not (portrait). Déclarer que votre activité gérera ces modifications peut être fait à partir du manifeste:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Gardez à l’esprit que cela signifie que vous devrez réellement gérer ces changements. Activity#onConfigurationChanged(), en mettant à jour manuellement les vues ou en rechargeant certaines ressources.

Fonctionnalités désactivées en mode multi-fenêtres

Certaines fonctionnalités du système ne seront pas affectées par vos activités en mode multi-fenêtre:
  • Les modifications de la barre d’état et de la barre de navigation, telles que l’atténuation/masquage des barres système ou l’utilisation du mode immersif, n’auront aucun effet. Cela est logique puisque votre activité n’occupe qu’une partie de l’écran.
  • Le android: screenOrientation L'attribut activité n'a également aucun effet en mode multi-fenêtre: puisque votre activité sera redimensionnable, cela n'a plus de sens qu'elle ait une orientation fixe.
De nouveaux rappels ont été ajoutés pour les événements multi-fenêtres, ainsi que des méthodes pour interroger l'état actuel.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): appelé lorsque l'état d'activité passe du plein écran à plusieurs fenêtres et vice versa.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): appelé lorsque l'état d'activité passe au/depuis le mode PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): indique si l'activité est en mode multi-fenêtre/image dans l'image ou non.
  • Activity#overlayWithDecorCaption(boolean overlay): pour les fenêtres de forme libre, cette méthode peut être utilisée pour que la légende (la barre utilisée pour faire glisser la fenêtre) recouvre le contenu au lieu de le pousser vers le bas.
PS. À l'exception de. Activity#overlayWithDecorCaption(), ces méthodes sont également fournies par le. Fragment classe.

Démarrage d'activités en mode multi-fenêtres

  • Activity#enterPictureInPictureMode() peut être utilisé pour mettre une activité en mode image dans l’image. Notez que les activités en mode PiP ne sont pas notifiées des événements d'entrée -- utilisez MediaSession#setMediaButtonReceiver() si vous souhaitez gérer de tels événements. Assurez-vous également de consulter le site Web des développeurs Android si vous êtes intéressé. Image dans l’image sur Android N.
  • Si l'appareil est en mode écran partagé, vous pouvez demander au système de lancer une autre activité à côté de la vôtre en utilisant le bouton Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT drapeau. Le drapeau n'a aucun effet si ce n'est en mode écran partagé.
  • Si l'appareil est en mode forme libre, ActivityOptions#setLaunchBounds() peut être utilisé pour spécifier les dimensions et l'emplacement de la nouvelle activité sur l'écran.
Pour obtenir des exemples de code, consultez l'exemple d'application Multi-Window Playground: exemple d'activité adjacente, exemple de limites de lancement.

Glisser déposer

Bien que la prise en charge du glisser-déposer existe depuis Honeycomb, elle n'était auparavant possible qu'au sein de la même activité. La neige. pris en charge en multi-fenêtre aussi. La mise en œuvre de cela semble être le cas. essentiellement le même qu'avant, avec quelques ajouts pour le glisser-déposer inter-activités:
  • View#startDragAndDrop()
    • Nouvel alias pour View#startDrag().
    • Pour activer le glisser-déposer inter-activités, transmettez le nouveau drapeau View#DRAG_FLAG_GLOBAL.
    • Si vous devez accorder des autorisations URI à l'activité du destinataire, transmettez les nouveaux indicateurs View#DRAG_FLAG_GLOBAL_URI_READ ou View#DRAG_FLAG_GLOBAL_URI_WRITE, le cas échéant.
  • View#updateDragShadow()
    • Remplace l'ombre de déplacement pour une opération de déplacement en cours. Ne peut être appelé que par l’application à l’origine de l’opération de glissement.
  • View#cancelDragAndDrop()
    • Annule une opération de glissement en cours. Ne peut être appelé que par l’application à l’origine de l’opération de glissement.
  • Vérifier si un appareil prend en charge les modes forme libre ou image dans l'image est possible via PackageManager#hasSystemFeature(), en utilisant PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT et PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE respectivement.
  • Le android: windowBackground L'attribut peut être utilisé comme arrière-plan dessinable, si l'activité est en cours de redimensionnement et que son rendu est en retard. Si android: windowBackground n'est pas défini, android: windowBackgroundFallback est utilisé à la place. Reportez-vous à l'exemple d'application Multi-Window Playground pour un exemple..
Wale a proposé quelques bonnes pratiques pour garantir à vos utilisateurs la meilleure expérience possible:
  • Gérer les changements de mode avec élégance :
    • Maintenir la cohérence de l’interface utilisateur quelle que soit l’orientation. Ne laissez pas les éléments changer de position pour permettre des transitions fluides.
    • En développant ce qui précède, ne basculez pas entre des mises en page très différentes pour les mises en page de téléphone/tablette. Au lieu de cela, adaptez la disposition de la tablette pour des tailles plus petites par souci de cohérence.
  • Assurez-vous que vos activités s'adaptent aux petites tailles par suivre les modèles de conception matérielle.
  • Utiliser FLAG_ACTIVITY_LAUNCH_ADJACENT quand il est logique de proposer une expérience plus agréable en mode écran partagé.
  • Ne déclarer l'incompatibilité du redimensionnement que lorsque cela est justifié. Comme nous l’avons mentionné ci-dessus, votre application se démarquerait autrement d’une mauvaise manière.
Wale a terminé la session en proposant quelques ressources utiles supplémentaires:
  • Documentation multi-fenêtres.
  • Directives de conception matérielle pour le mode écran partagé.
  • Exemple d'application multi-fenêtres.