Ventana múltiple en Android N: lo que los desarrolladores deben saber para aprovecharlo al máximo

Proporcionamos una descripción general de lo que significa para los desarrolladores la próxima compatibilidad con ventanas múltiples en Android N y cómo aprovecharla al máximo.

La compatibilidad con ventanas múltiples es una característica interesante que estamos esperando en Android N, y uno que queríamos que estuviera disponible en todos los dispositivos desde hacía mucho tiempo. Sin embargo, para que sea una experiencia agradable, es posible que los desarrolladores tengan que realizar algunos cambios en sus aplicaciones para admitirla correctamente.

Una de las sesiones de Google I/O fue para que los desarrolladores conocieran las nuevas API y los cambios en el comportamiento del sistema que aporta la compatibilidad con múltiples ventanas.

La sesión fue presentada por Wale Ogunwale, director técnico principal de Android ActivityManager y Componentes del marco WindowManager: él y su equipo son los responsables de las ventanas múltiples en Android.

Puedes ver el Sesión en modo Multi-Ventana en YouTube, pero también ofrecemos una descripción general de la sesión aquí.

N presenta tres modos diferentes de ventanas múltiples:
  • Modo de pantalla dividida: este es el modo que está disponible por defecto. Como su nombre lo indica, le permite abrir dos aplicaciones una al lado de la otra.
  • Modo de forma libre: los fabricantes pueden habilitarlo en dispositivos más grandes, lo que permite a los usuarios cambiar el tamaño de las actividades libremente además del modo de pantalla dividida.
  • Modo imagen en imagen: dirigido a dispositivos Android TV, este modo está pensado para que los reproductores de vídeo se ejecuten en una ventana fijada mientras el usuario interactúa con otras aplicaciones.
Modo de pantalla dividida de Android NModo Android N PiP
Vale la pena señalar que. Hemos cubierto la ventana múltiple en N antes y hemos ofrecido algunas críticas al sistema actual.. Con eso en mente, esperamos que el modo de forma libre se acerque un poco más al modo de imagen en imagen, ya que tendría aplicaciones útiles en todos los dispositivos.
Habilitar la compatibilidad con ventanas múltiples en sus aplicaciones es simple: no necesita hacer nada si ya está apuntando a N. Si decide deshabilitar las ventanas múltiples, puede hacerlo configurando el. android: resizeableActivity atributo de actividad en su manifiesto para. false. Esto sólo debe hacerse si está realmente justificado, ya que hace que su aplicación destaque mal siempre. iniciarse en modo de pantalla completa incluso si el usuario (u otra aplicación) intenta iniciarlo en múltiples ventanas modo. Es importante tener en cuenta que los atributos de una actividad raíz se aplican a todas las actividades dentro de su pila de tareas. En otras palabras, si tiene una actividad que otras aplicaciones pueden iniciar, asegúrese de que sea compatible con el modo de ventanas múltiples. ya que no puede garantizar que otras aplicaciones inicien su actividad en una nueva tarea. Intent#FLAG_ACTIVITY_NEW_TASK .La compatibilidad con el modo imagen en imagen debe declararse explícitamente a través de. android: supportsPictureInPicture atributo. Tenga en cuenta que este atributo se ignora si. android: resizeableActivity es. false Los atributos de diseño se pueden utilizar para establecer dimensiones y ubicación predeterminadas para ventanas de forma libre, o para especificar un ancho o alto mínimo tanto para los modos de forma libre como de pantalla dividida:
  • android: defaultWidth/android: defaultHeight: las dimensiones predeterminadas de la actividad (modo de forma libre).
  • android: gravity: la posición inicial de la actividad (modo de forma libre).
  • android: minimalWidth/android: minimalHeight: las dimensiones mínimas de la actividad (modos de forma libre y pantalla dividida)
Puede encontrar un ejemplo de código en. Aplicación de muestra de Google Multi-Window Playground en GitHub: AndroidManifest.xml.
Con la introducción de la compatibilidad con ventanas múltiples, es posible que deba volver a verificar algunas cosas en sus aplicaciones para asegurarse de que funcionen correctamente.

Comprender el ciclo de vida de la actividad

El. ciclo de vida de la actividad no cambia en el modo de ventanas múltiples: Ciclo de vida básico de la actividad de Android Dicho esto, algunas diferencias sutiles entre los estados de actividad pueden dar lugar a un comportamiento no deseado que normalmente no notarías antes de N. Es importante saber eso. Activity#onResume() y. Activity#onPause() se llaman cuando su aplicación gana o pierde enfoque, pero no necesariamente cuando comienza o deja de ser visible. (Recuerde que solo una aplicación puede tener foco en un momento dado). Para las aplicaciones que actualizan el contenido constantemente (por ejemplo, reproducción de video), asegúrese de controlar el inicio y la detención de las actualizaciones de contenido. Activity#onStart() y. Activity#onStop() en cambio. No hacerlo para aplicaciones de vídeo, por ejemplo, significará que la reproducción solo se producirá si la aplicación está enfocada, lo que anula el propósito del modo de ventanas múltiples. La aplicación oficial de YouTube tuvo un problema similar cuando se lanzó por primera vez Android N Developer Preview..

Manejo de cambios en tiempo de ejecución

Cuando una aplicación se pone en modo de ventanas múltiples, algunas configuraciones del dispositivo cambiarán. Puedes permitir que tu actividad se reinicie (en cuyo caso. retener fragmentos podría ser una buena idea, si su actividad debe realizar una operación intensiva al inicio), o elegir hacerlo. manejar los cambios de configuración explícitamente en cambio. Cuatro configuraciones del dispositivo pueden cambiar al ingresar o dentro del modo de ventanas múltiples: screenSize, smallestScreenSize, screenLayout y. orientation. Referirse a. Documentación para desarrolladores de Android para obtener más información sobre cada atributo, pero tenga en cuenta eso. orientation En este caso ya no se refiere a la orientación del dispositivo. En cambio, simplemente indica si el ancho de su actividad es mayor que su altura (paisaje) o no (retrato). Puede declarar que su actividad manejará estos cambios desde el manifiesto:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Tenga en cuenta que esto significa que realmente necesitará manejar estos cambios. Activity#onConfigurationChanged(), actualizando manualmente las vistas o recargando algunos recursos.

Funciones deshabilitadas en modo de ventanas múltiples

Algunas características del sistema no se verán afectadas por sus actividades mientras esté en modo de ventanas múltiples:
  • Los cambios en la barra de estado y la barra de navegación, como atenuar/ocultar las barras del sistema o usar el modo inmersivo, no tendrán ningún efecto. Esto tiene sentido ya que tu actividad sólo ocupa parte de la pantalla.
  • El android: screenOrientation El atributo de actividad tampoco tiene efecto en el modo de ventanas múltiples: dado que se podrá cambiar el tamaño de su actividad, ya no tiene sentido que tenga una orientación fija.
Se han agregado nuevas devoluciones de llamada para eventos de ventanas múltiples, así como métodos para consultar el estado actual.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): se llama cuando el estado de la actividad cambia de pantalla completa a ventana múltiple y viceversa.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): se llama cuando el estado de la actividad cambia hacia/desde el modo PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): devuelve si la actividad está en modo de ventanas múltiples/imagen en imagen o no.
  • Activity#overlayWithDecorCaption(boolean overlay): para ventanas de forma libre, este método se puede utilizar para hacer que el título (la barra utilizada para arrastrar la ventana) se superponga al contenido en lugar de empujarlo hacia abajo.
PD. Excepto por. Activity#overlayWithDecorCaption(), estos métodos también los proporciona. Fragment clase.

Iniciar actividades en modo de ventanas múltiples

  • Activity#enterPictureInPictureMode() se puede utilizar para poner una actividad en modo imagen en imagen. Tenga en cuenta que las actividades en modo PiP no reciben notificaciones sobre eventos de entrada; use MediaSession#setMediaButtonReceiver() si desea manejar tales eventos. También asegúrese de consultar el sitio web de desarrolladores de Android si está interesado en Imagen en imagen en Android N.
  • Si el dispositivo está en modo de pantalla dividida, puede indicarle al sistema que inicie otra actividad junto a la suya usando el Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT bandera. La bandera no tiene ningún efecto si no está en modo de pantalla dividida.
  • Si el dispositivo está en modo de forma libre, ActivityOptions#setLaunchBounds() se puede utilizar para especificar las dimensiones y la ubicación de la nueva actividad en la pantalla.
Para ver ejemplos de código, consulte la aplicación de muestra Multi-Window Playground: ejemplo de actividad adyacente, ejemplo de límites de lanzamiento.

Arrastrar y soltar

Si bien la compatibilidad con arrastrar y soltar existe desde Honeycomb, anteriormente solo era posible dentro de la misma actividad. Nieva. compatible con ventanas múltiples también. Implementar esto parece serlo. casi igual que antes, con algunas adiciones para arrastrar y soltar entre actividades:
  • View#startDragAndDrop()
    • Nuevo alias para View#startDrag().
    • Para habilitar la función de arrastrar y soltar entre actividades, pase la nueva bandera View#DRAG_FLAG_GLOBAL.
    • Si necesita otorgar permisos de URI a la actividad del destinatario, pase las nuevas banderas View#DRAG_FLAG_GLOBAL_URI_READ o View#DRAG_FLAG_GLOBAL_URI_WRITE, según sea apropiado.
  • View#updateDragShadow()
    • Reemplaza la sombra de arrastre de una operación de arrastre actualmente en curso. Solo puede ser llamado por la aplicación que originó la operación de arrastre.
  • View#cancelDragAndDrop()
    • Cancela una operación de arrastre actualmente en curso. Solo puede ser llamado por la aplicación que originó la operación de arrastre.
  • Es posible comprobar si un dispositivo admite modos de forma libre o imagen en imagen a través de PackageManager#hasSystemFeature(), usando PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT y PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE respectivamente.
  • El android: windowBackground El atributo se puede utilizar como elemento de diseño de fondo, si se cambia el tamaño de la actividad y su representación se retrasa. Si android: windowBackground no está configurado, android: windowBackgroundFallback se utiliza en su lugar. Consulte la aplicación de muestra Multi-Window Playground para ver un ejemplo..
Wale ofreció algunas prácticas recomendadas para garantizar que sus usuarios tengan la mejor experiencia posible:
  • El modo de manejo cambia elegantemente:
    • Mantenga la coherencia de la interfaz de usuario independientemente de la orientación. No haga que los elementos cambien de posición para permitir transiciones suaves.
    • Ampliando lo anterior, no cambie entre diseños muy diferentes para diseños de teléfono/tableta. En su lugar, adapte el diseño de la tableta a tamaños más pequeños para mantener la coherencia.
  • Asegúrate de que tus actividades se adapten a tallas pequeñas por siguiendo los patrones de Material Design.
  • Usar FLAG_ACTIVITY_LAUNCH_ADJACENT cuando tiene sentido ofrecer una experiencia más agradable en el modo de pantalla dividida.
  • Declarar incompatibilidad de cambio de tamaño sólo cuando esté justificado. Como comentamos anteriormente, de lo contrario, hace que su aplicación se destaque mal.
Wale finalizó la sesión ofreciendo algunos recursos útiles adicionales:
  • Documentación de ventanas múltiples.
  • Directrices de Material Design para el modo de pantalla dividida.
  • Aplicación de muestra de ventanas múltiples.