page.title=Compatibilidad con ventanas múltiples page.metaDescription=Nueva compatibilidad en Android N para mostrar más de una aplicación a la vez. page.keywords="multi-window", "android N", "split screen", "free-form" @jd:body

En este documento

  1. Información general
  2. Ciclo de vida en modo de ventanas múltiples
  3. Configuración de tu aplicación para el modo de ventanas múltiples
  4. Ejecución de tu aplicación en modo de ventanas múltiples
  5. Prueba de la compatibilidad de tu aplicación con el uso de ventanas múltiples

Consulta también

  1. Aplicación de ejemplo para la prueba de ventanas múltiples
  2. Cinco tips para prepararse para ventanas múltiples en Android N

Android N agrega compatibilidad con la visualización de más de una aplicación a la vez. En dispositivos portátiles, se pueden ejecutar dos aplicaciones una al lado de la otra o una por encima de la otra en modo de pantalla dividida. En dispositivos de TV, las aplicaciones pueden usar el modo picture-in-picture para continuar la reproducción de video mientras los usuarios interactúan con otra aplicación.

Si compilas tu aplicación con el N Preview SDK, puedes configurar la manera en que tu aplicación administra la visualización de ventanas múltiples. Por ejemplo, puedes especificar las dimensiones mínimas permitidas de tu actividad. También puedes inhabilitar la visualización de ventanas múltiples para tu aplicación asegurándote de que el sistema solo muestre tu aplicación en modo de pantalla completa.

Información general

Android N permite que varias aplicaciones compartan la pantalla al mismo tiempo. Por ejemplo, un usuario podría dividir la pantalla y ver una página web a la izquierda mientras escribe un correo electrónico a la derecha. La experiencia de usuario depende del dispositivo:

Figura 1: Dos aplicaciones ejecutándose una al lado de la otra en modo de pantalla dividida.

El usuario puede cambiar a modo de ventanas múltiples de la siguiente manera:

Los usuarios pueden arrastrar y soltar datos de una actividad a otra mientras las actividades comparten la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una sola actividad).

Ciclo de vida en modo de ventanas múltiples

El modo de ventanas múltiples no cambia el ciclo de vida de la actividad.

En modo de ventanas múltiples, solo la actividad con la que el usuario interactuó más recientemente está activa en un momento determinado. Esa actividad se considera la principal. Todas las demás actividades están pausadas, aunque estén visibles. No obstante, el sistema les da a esas actividades pausadas pero visibles una prioridad más alta que las actividades que no están visibles. Si el usuario interactúa con una de las actividades pausadas, se reanuda esa actividad y se pausa la actividad que antes era la principal.

Nota: En modo de ventanas múltiples, una aplicación puede estar pausada y aún visible para el usuario. Es posible que una aplicación necesite continuar sus actividades mientras está pausada. Por ejemplo, una aplicación de reproducción de video que está pausada pero visible debería continuar mostrando el video. Por ese motivo, recomendamos que las actividades que reproducen video no pausen el video en sus controladores{@link android.app.Activity#onPause onPause()}. En su lugar, deben pausar el video en {@link android.app.Activity#onStop onStop()} y reanudar la reproducción en {@link android.app.Activity#onStart onStart()}.

Cuando el usuario coloca una aplicación en modo de ventanas múltiples, el sistema le notifica a la actividad de un cambio de configuración, tal como se especifica en Control de cambios en tiempo de ejecución. Esto también sucede cuando el usuario modifica el tamaño de la aplicación o coloca la aplicación nuevamente en el modo de pantalla completa. Básicamente, este cambio tiene las mismas consecuencias en el ciclo de vida de la actividad que cuando el sistema notifica a la aplicación que el dispositivo cambió de modo vertical a modo de paisaje, excepto porque se modifican las dimensiones del dispositivo en lugar de intercambiarse solamente. Como se aborda en Control de cambios en tiempo de ejecución, tu actividad puede administrar el cambio de configuración por sí misma, o puede permitir que el sistema destruya la actividad y la vuelva a crear con las nuevas dimensiones.

Si el usuario cambia el tamaño de una ventana y la agranda en cualquier dirección, el sistema modifica el tamaño de la actividad para que coincida con la acción del usuario y emite cambios en tiempo de ejecución según sean necesarios. Si la aplicación se retrasa en el trazado de áreas recientemente expuestas, el sistema rellena esas áreas con el color especificado por el atributo {@link android.R.attr#windowBackground windowBackground} o por el atributo de estilo predeterminado windowBackgroundFallback.

Configuración de tu aplicación para el modo de ventanas múltiples

Si tu aplicación está orientada a Android N, puedes configurar cómo y si quieres que las actividades de tu aplicación admitan la visualización de ventanas múltiples. Puedes establecer atributos en tu manifiesto para controlar el tamaño y el diseño. La configuración de atributos de una actividad raíz se aplica a todas las actividades de su pila de tareas. Por ejemplo, si android:resizeableActivity está configurado en true para la actividad raíz, se puede modificar el tamaño de todas las actividades de la pila de tareas.

Nota: Si compilas una aplicación con múltiples orientaciones con una versión del SDK anterior a Android N, y el usuario usa la aplicación en modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada. El sistema presenta un cuadro de diálogo en el que se advierte al usuario que la aplicación puede comportarse de forma inesperada. El sistema no modifica el tamaño de aplicaciones con orientación fija; si el usuario intenta abrir una aplicación con orientación fija en modo de ventanas múltiples, la aplicación ocupará toda la pantalla.

android:resizeableActivity

Establece este atributo en el nodo <activity> o <application> de tu manifiesto para habilitar o inhabilitar la visualización en modo de ventanas múltiples:

android:resizeableActivity=["true" | "false"]

Si este atributo se establece en true, la actividad puede iniciarse en los modos de pantalla dividida y forma libre. Si el atributo se establece en false, la actividad no admite el modo de ventanas múltiples. Si el valor es false, y el usuario intenta iniciar la actividad en modo de ventanas múltiples, la actividad ocupará toda la pantalla.

Si tu aplicación está orientada a Android N, pero no especificas un valor para este atributo, el valor predeterminado del atributo será true.

android:supportsPictureInPicture

Establece este atributo en el nodo <activity> de tu manifiesto para indicar si la actividad admite la visualización de Picture-in-picture. Este atributo se ignora si android:resizeableActivity es false.

android:supportsPictureInPicture=["true" | "false"]

Atributos de diseño

Con Android N, el elemento de manifiesto <layout> admite varios atributos que afectan cómo se comporta una actividad en modo de ventanas múltiples:

android:defaultWidth
Ancho predeterminado de la actividad cuando se inicia en modo de forma libre.
android:defaultHeight
Altura predeterminada de la actividad cuando se inicia en modo de forma libre.
android:gravity
Ubicación inicial de la actividad cuando se inicia en modo de forma libre. Consulta la referencia {@link android.view.Gravity} para obtener valores adecuados.
android:minimalHeight, android:minimalWidth
Altura y ancho mínimos para la actividad tanto en el modo de pantalla dividida como en el modo de forma libre. Si el usuario mueve la línea divisoria en el modo de pantalla dividida para reducir el tamaño respecto del tamaño mínimo especificado, el sistema recorta la actividad para ajustarla a los requisitos del usuario.

Por ejemplo, el siguiente código muestra cómo especificar el tamaño y la ubicación predeterminados de una actividad, y su tamaño mínimo, cuando la actividad se visualiza en modo de forma libre:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end"
          android:minimalHeight="450dp"
          android:minimalWidth="300dp" />
</activity>

Ejecución de tu aplicación en modo de ventanas múltiples

Android N ofrece nuevas funcionalidades para admitir aplicaciones que puedan ejecutarse en modo de ventanas múltiples.

Funciones deshabilitadas en modo de ventanas múltiples

Ciertas funciones están deshabilitadas o se ignoran cuando un dispositivo se encuentra en modo de ventanas múltiples, ya que no resultan útiles para una actividad que podría estar compartiendo la pantalla del dispositivo con otras actividades o aplicaciones. Esas funciones incluyen las siguientes:

Notificación y consulta de cambios en modo de ventanas múltiples

Se agregaron los siguientes métodos nuevos a la clase {@link android.app.Activity} para admitir la visualización de ventanas múltiples. Para obtener información detallada sobre cada método, consulta la Referencia sobre N Preview SDK .

Activity.isInMultiWindowMode()
Realiza una llamada para averiguar si la actividad está en modo de ventanas múltiples.
Activity.isInPictureInPictureMode()
Realiza una llamada para averiguar si la actividad está en modo Picture-in-picture.

Nota: El modo Picture-in-picture es un caso especial del modo de ventanas múltiples. Si myActivity.isInPictureInPictureMode() devuelve un valor true, myActivity.isInMultiWindowMode() también devuelve un valor true.

Activity.onMultiWindowModeChanged()
El sistema llama a este método siempre que la actividad entra en modo de ventanas múltiples o sale de él. El sistema le pasa al método un valor de true si la actividad entra en modo de ventanas múltiples y false si la actividad sale del modo de ventanas múltiples.
Activity.onPictureInPictureModeChanged()
El sistema llama a este método siempre que la actividad entra en modo Picture-in-picture o sale de él. El sistema le pasa al método un valor de true si la actividad entra en modo Picture-in-picture y false si la actividad sale de dicho modo.

También hay versiones {@link android.app.Fragment} de cada uno de esos métodos; por ejemplo, Fragment.isInMultiWindowMode().

Cómo entrar en modo Picture-in-picture

Para que una actividad entre en modo de Picture-in-picture, debes llamar al nuevo método Activity.enterPictureInPictureMode(). Este método no tiene efecto si el dispositivo no admite el modo de imagen en imagen. Para obtener más información, consulta la documentación de Picture-in-Picture.

Inicia nuevas actividades en modo de ventanas múltiples

Cuando inicias una nueva actividad, puedes indicarle al sistema que la nueva actividad se debe mostrar adyacente a la actual, si fuera posible. Para hacer esto, usa el marcador Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT. Pasar este marcador requiere el siguiente comportamiento:

Si un dispositivo está en modo de forma libre e inicias una nueva actividad, puedes especificar las dimensiones y la ubicación de la pantalla de la nueva actividad al llamar a ActivityOptions.setLaunchBounds(). Este método no tiene efecto si el dispositivo no está en modo de ventanas múltiples.

Nota: Si inicias una actividad en una pila de tareas, esa actividad reemplaza la actividad en pantalla y hereda todas sus propiedades de ventanas múltiples. Si quieres iniciar la nueva actividad en una ventana independiente en modo de ventanas múltiples, debes iniciarla en una nueva pila de tareas.

Admisión de la funcionalidad de arrastrar y soltar

Los usuarios pueden arrastrar y soltar datos de una actividad a otra mientras las dos actividades comparten la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una sola actividad). Por este motivo, te recomendamos que agregues la funcionalidad de arrastrar y soltar a tu aplicación si es que aún no la admite.

El N Preview SDK amplía el paquete android.view para admitir la funcionalidad de arrastrar y soltar entre aplicaciones diferentes. Para obtener información detallada sobre las siguientes clase y métodos, consulta la Referencia del N Preview SDK.

android.view.DropPermissions
Objeto token responsable de especificar los permisos otorgados a la aplicación que recibe datos mediante la funcionalidad de arrastrar y soltar.
View.startDragAndDrop()
Nuevo alias para {@link android.view.View#startDrag View.startDrag()}. Para habilitar la funcionalidad arrastrar y soltar entre diferentes actividades, pasa el nuevo marcador View.DRAG_FLAG_GLOBAL. Si necesitas otorgar permisos de URI a la actividad receptora, pasa los nuevos marcadores View.DRAG_FLAG_GLOBAL_URI_READ o View.DRAG_FLAG_GLOBAL_URI_WRITE, según corresponda.
View.cancelDragAndDrop()
Cancela una operación de arrastrar actualmente en curso. Solo puede ser llamado por la aplicación que originó la operación de arrastrar.
View.updateDragShadow()
Reemplaza la sombra del arrastre por una operación de arrastrar actualmente en curso. Solo puede ser llamado por la aplicación que originó la operación de arrastrar.
Activity.requestDropPermissions()
Solicita los permisos para los URI de contenido que se pasan con el {@link android.content.ClipData} incluido en un {@link android.view.DragEvent}.

Prueba de la compatibilidad de tu aplicación con el uso de ventanas múltiples

Ya sea que actualices o no tu aplicación para Android N, debes verificar la forma en que se comporta en modo de ventanas múltiples en caso de que un usuario intente iniciarla en modo de ventanas múltiples en un dispositivo con Android N.

Configuración de un dispositivo de prueba

Si instalas Android N en un dispositivo, se admite automáticamente el modo de pantalla dividida.

Si tu aplicación no se compiló con el N Preview SDK

Si no creaste tu aplicación con el N Preview SDK y el usuario intenta usar la aplicación en modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada, a menos que la aplicación declare una orientación fija.

Si tu aplicación no declara una orientación fija, debes iniciar tu aplicación en un dispositivo con Android N e intentar colocar la aplicación en modo de pantalla dividida. Cuando se modifique el tamaño de la aplicación de forma forzada, verifica que la experiencia de usuario sea aceptable.

Si la aplicación declara una orientación fija, debes intentar colocar la aplicación en modo de ventanas múltiples. Cuando lo hagas, verifica que la aplicación continúe en modo de pantalla completa.

Si admites el modo de ventanas múltiples

Si compilaste tu aplicación con el N Preview SDK y no deshabilitaste la compatibilidad con ventanas múltiples, verifica el siguiente comportamiento tanto en modo de pantalla dividida como en modo de forma libre.

Lista de comprobación de pruebas

Para verificar el rendimiento de tu aplicación en modo de ventanas múltiples, intenta las siguientes operaciones. Debes probar estas operaciones tanto en modo de pantalla dividida como en modo de ventanas múltiples, excepto cuando se indique algo diferente.

Si deshabilitaste la compatibilidad con el modo de ventanas múltiples

Si deshabilitaste la compatibilidad con el modo de ventanas múltiples al configurar android:resizableActivity="false", debes iniciar tu aplicación en un dispositivo con Android N e intentar colocar la aplicación en los modos de forma libre y pantalla dividida. Cuando lo hagas, verifica que la aplicación continúe en modo de pantalla completa.