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í.
- 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.
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)
Comprender el ciclo de vida de la actividad
El. ciclo de vida de la actividad no cambia en el modo de ventanas múltiples: 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.
-
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.
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; useMediaSession#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.
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
oView#DRAG_FLAG_GLOBAL_URI_WRITE
, según sea apropiado.
- Nuevo alias para
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()
, usandoPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
yPackageManager#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. Siandroid: windowBackground
no está configurado,android: windowBackgroundFallback
se utiliza en su lugar. Consulte la aplicación de muestra Multi-Window Playground para ver un ejemplo..
- 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.
- Documentación de ventanas múltiples.
- Directrices de Material Design para el modo de pantalla dividida.
- Aplicación de muestra de ventanas múltiples.