El modo multiventana permite que varias apps compartan la misma pantalla simultáneamente. Las apps pueden aparecer una al lado de la otra o una encima de la otra (modo de pantalla dividida); una app en una ventana pequeña que se superpone a otras apps (modo de pantalla en pantalla) o en ventanas que se pueden mover y cambiar de tamaño (modo de formato libre).
La experiencia del usuario depende de la versión de Android y del tipo de dispositivo:
Android 7.0 (nivel de API 24) introdujo el modo de pantalla dividida en pantallas pequeñas y el modo pantalla en pantalla en dispositivos seleccionados.
El modo de pantalla dividida ocupa la pantalla con dos apps y las muestra. una al lado de la otra o una encima de la otra. Los usuarios pueden arrastrar el divisor y separar las dos apps para hacer que una sea más grande y que la otra sea más pequeña.
El modo de pantalla en pantalla permite que los usuarios continúen con la reproducción de video. mientras interactúas con otra app (consulta Compatibilidad con pantalla en pantalla)
El modo de formato libre, en el que los usuarios pueden cambiar el tamaño de cada actividad libremente, que los fabricantes de dispositivos con pantallas grandes puedan habilitar.
Puedes configurar la manera en que tu app controla el modo multiventana especificando las dimensiones mínimas permitidas de tu actividad. También puedes inhabilitar el modo multiventana para tu app estableciendo
resizeabableActivity="false"
para garantizar que el sistema siempre muestre la app en pantalla completa.
Android 8.0 (nivel de API 26) extiende el modo de pantalla en pantalla al tamaño pequeño dispositivos de pantalla.
Android 12 (nivel de API 31) establece el modo multiventana como el comportamiento estándar.
En pantallas grandes (clase de tamaño de ventana mediana o expandida), la es compatible con todas las apps en el modo multiventana, independientemente de la app configuración. Si es
resizeableActivity="false"
, la app se coloca en modo de compatibilidad cuando sea necesario para adaptarse a las dimensiones de la pantalla.En pantallas pequeñas (clase de tamaño de ventana compacta), el sistema verifica el
minWidth
yminHeight
de una actividad para determinar si la actividad puede ejecutarse en el modo multiventana. SiresizeableActivity="false"
, la app no podrá ejecutarse en modo multiventana, independientemente del ancho y la altura mínimos.
Modo de pantalla dividida
Para activar el modo de pantalla dividida los usuarios pueden hacer lo siguiente:
- Abre la pantalla Recientes.
- Deslizar una app para verla
- Presionar el ícono de la app en la barra de título
- Seleccionar la opción del menú de pantalla dividida
- Seleccionar otra aplicación desde la pantalla Recientes o cerrar esa pantalla y ejecutar otra app
Para salir del modo de pantalla dividida, los usuarios pueden arrastrar la línea divisoria de las ventanas hacia el borde de la pantalla: arriba o abajo, izquierda o derecha.
Elementos junto a los selectores
Si tu app necesita acceder a contenido a través de un intent, puedes usar
FLAG_ACTIVITY_LAUNCH_ADJACENT
para abrir el contenido en un
ventana de pantalla dividida.
FLAG_ACTIVITY_LAUNCH_ADJACENT
se introdujo en Android 7.0 (nivel de API 24) para
Permitir que las apps que se ejecuten en el modo de pantalla dividida inicien actividades en la ubicación adyacente
en la ventana modal.
Android 12L (nivel de API 32) y versiones posteriores extendieron la definición de la marca a habilitar las apps que se ejecutan en pantalla completa para activar el modo de pantalla dividida y, luego, iniciar en la ventana adyacente.
Para iniciar una actividad adyacente, usa FLAG_ACTIVITY_LAUNCH_ADJACENT
en
con FLAG_ACTIVITY_NEW_TASK
, por ejemplo:
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
Ciclo de vida de la actividad en el modo multiventana
El modo multiventana no cambia el ciclo de vida de la actividad. Sin embargo, el el estado reanudado de las apps en varias ventanas difiere según la versión de Android
Reanudación múltiple
Android 10 (nivel de API 29) y las versiones posteriores admiten la reanudación múltiple, todas
Las actividades permanecen en el estado RESUMED
cuando el dispositivo está en el modo multiventana
. Una actividad se puede pausar si hay una actividad transparente en la parte superior de la
o la actividad no es enfocable, por ejemplo, si se encuentra en
modo de pantalla en pantalla. También es posible que ninguna actividad se enfoque en un
un momento determinado, por ejemplo, si el panel lateral de notificaciones está abierto. La onStop()
método funciona como de costumbre: se llama al método cada vez que se desactiva una actividad
la pantalla.
La reanudación múltiple también está disponible en ciertos dispositivos con Android 9 (nivel de API 28). Para habilitar la reanudación múltiple en dispositivos con Android 9, agrega los siguientes metadatos de manifiesto:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Para verificar que un dispositivo en particular admita estos metadatos de manifiesto, consulta sus especificaciones.
Android 9
En el modo multiventana de Android 9 (nivel de API 28) y versiones anteriores, solo está activa en un momento determinado la actividad con la que el usuario interactuó más recientemente. Esta
la actividad se considera principal y es la única actividad en el RESUMED
para cada estado. Todas las demás actividades visibles tienen el estado STARTED
, pero no son RESUMED
.
Sin embargo, el sistema otorga a estas actividades visibles pero no reanudadas más arriba.
tienen prioridad que las actividades que no son visibles. Si el usuario interactúa con uno de
las actividades visibles, se reanuda esa actividad y los espacios
actividad entra al estado STARTED
.
Cuando hay varias actividades dentro de un solo proceso de app activo, se reanuda la actividad con el orden Z más alto y se pausan las demás.
Cambios de configuración
Cuando el usuario coloca una aplicación en el modo multiventana, el sistema notifica al la actividad de un cambio de configuración, como se especifica en Cómo administrar la configuración de la configuración. Esto también sucede cuando el usuario cambia el tamaño de la app o la restablece. al modo de pantalla completa.
En esencia, este cambio tiene las mismas implicaciones en el ciclo de vida de la actividad que cuando el sistema notifica a la app que el dispositivo ha cambiado de vertical a con orientación horizontal, con la excepción de que se cambian las dimensiones de la app en lugar de de que solo se estén intercambiando. Tu actividad puede manejar el cambio de configuración por sí misma, o tu app puede permitir que el sistema destruya la actividad y la vuelva a crear con el dimensiones nuevas.
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 de configuración según sea necesario. Si la aplicación se retrasa en el dibujo de áreas recientemente expuestas, la
sistema cubre temporalmente esas áreas con el color especificado por
windowBackground
o de forma predeterminada
atributo de estilo windowBackgroundFallback
.
Acceso a recursos exclusivos
Para admitir la función de reanudación múltiple, usa la
Es la devolución de llamada de ciclo de vida de onTopResumedActivityChanged()
.
Se invoca la devolución de llamada cuando una actividad gana o pierde la actividad más reanudada. importante cuando una actividad usa un recurso singleton compartido como el micrófono o la cámara:
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Ten en cuenta que una app puede perder recursos debido a otras razones, como quitar una pieza de hardware compartida.
En cualquier caso, una app debe administrar de manera fluida los eventos y los cambios de estado que afectan a los recursos disponibles.
Para las apps que usan una cámara,
CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
te da una pista de que podría ser un buen momento para intentar acceder a la cámara.
Este método está disponible a partir de Android 10 (nivel de API 29).
Recuerda que resizeableActivity=false
no es una garantía de acceso exclusivo a la cámara.
de acceso, ya que otras apps que usan la cámara se pueden abrir en otras pantallas.
No es necesario que tu app libere la cámara cuando pierde el enfoque. Por ejemplo, es posible que quieras continuar con la vista previa de la cámara mientras el usuario interactúa. con la app recién enfocada que se reanudó más arriba. No hay problema con que la app ejecutar la cámara cuando no es la app que se reanudó más arriba, pero tiene que controlar el caso de desconexión correctamente. Cuando la aplicación más reanudada quiera usar la la cámara puede abrirla, y tu aplicación perderá el acceso. Tu app puede volver a abrir la cuando la app recupera el enfoque.
Después de que una app recibe una CameraDevice.StateCallback#onDisconnected()
las siguientes llamadas al dispositivo de cámara arrojarán un mensaje
CameraAccessException
Varias pantallas
Android 10 (nivel de API 29) admiten actividades en pantallas secundarias. Si una actividad se ejecuta en un dispositivo con pantallas múltiples, los usuarios pueden mover la actividad de una pantalla a otra. La reanudación múltiple se aplica a también en escenarios multipantalla: varias actividades pueden recibir entradas del usuario en el mismo tiempo.
Una app puede especificar en qué pantalla debe ejecutarse cuando se inicia o cuando crea otra actividad. Este comportamiento depende del modo de inicio de la actividad definido en el archivo de manifiesto, y de las opciones y los marcadores de intent establecidos por la entidad que inicia la actividad. Consulta la clase ActivityOptions
para obtener más información.
más detalles.
Cuando una actividad se traslada a una pantalla secundaria, puede atravesar una actualización de contexto, un cambio de tamaño de ventana, y modificaciones en la configuración y los recursos. Si la actividad
controla el cambio de configuración, se notifica la actividad en
onConfigurationChanged()
De lo contrario, se volverá a iniciar la actividad.
Una actividad debe verificar la pantalla actual en onCreate()
y
Es onConfigurationChanged()
si se controla el cambio de configuración. Asegúrate de actualizar los recursos y diseños cuando cambie la pantalla.
Si el modo de inicio seleccionado para una actividad permite varias instancias, iniciar en una pantalla secundaria puede crear una nueva instancia de la actividad. Ambas actividades se reanudan al mismo tiempo.
También te recomendamos leer sobre las APIs de pantallas múltiples que se presentaron. en Android 8.0.
Contexto de la actividad frente a contexto de la aplicación
Usar el contexto correcto es crucial en las pantallas múltiples. Cuando se accede a recursos, el contexto de la actividad (que se muestra) difiere del contexto de la aplicación (que no se muestra).
El contexto de la actividad contiene información sobre la pantalla y siempre se ajusta de acuerdo con el área de visualización donde aparece la actividad. Esto te permite obtener la información correcta sobre la densidad de la pantalla o las métricas de la ventana de tu . Siempre debes usar el contexto de la actividad (o cualquier otro contenido basado en contextual) para obtener información sobre la ventana o pantalla actual. Esto también afecta algunas APIs del sistema que usan información del contexto (por ejemplo, consulta Descripción general de los avisos).
La configuración de la ventana de la actividad y la pantalla superior definen recursos y contexto. Para obtener la pantalla actual, usa lo siguiente:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Para obtener las métricas de la ventana de la actividad actual, usa lo siguiente:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Si quieres obtener las métricas máximas de la ventana para la configuración actual del sistema, usa el siguiente comando:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
Las métricas máximas de la ventana son para realizar cálculos, elegir el diseño o determinar el tamaño de los recursos que se deben recuperar con anticipación. Tener esta información disponible en onCreate()
te permite tomar estas decisiones antes del primer pase de diseño. Estas métricas no deben usarse para distribuir elementos de vista específicos.
en su lugar, utiliza información del objeto Configuration
.
Cortes de pantalla
Los dispositivos plegables pueden tener una geometría de cortes diferente cuando se pliegan y se despliegan. Para evitar problemas relacionados con los cortes, consulta Cómo brindar compatibilidad con cortes de pantalla.
Pantallas secundarias
Puedes obtener las pantallas disponibles del servicio del sistema DisplayManager
:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
Usa la clase Display
para obtener información sobre una pantalla en particular, como
como el tamaño de visualización o marcas que indican si una pantalla es segura.
Sin embargo, no supongas que el tamaño de la pantalla será el mismo que el de la
el área de visualización asignada a tu aplicación. Recuerda que, en el modo multiventana,
tu aplicación ocupa una parte de la pantalla.
Determina si una actividad puede iniciarse en una pantalla:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Luego, inicia la actividad en la pantalla:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
Compatibilidad con pantallas múltiples
Android brinda compatibilidad con pantallas múltiples en teclados en pantalla, fondos de pantalla y selectores.
Teclado de software
Se puede mostrar un teclado en una pantalla secundaria si está configurada para admitir decoraciones del sistema. El editor del método de entrada aparecerá automáticamente si un campo de texto solicita una entrada en esa pantalla.
Fondo de pantalla
En Android 10 (nivel de API 29), las pantallas secundarias pueden tener un fondo de pantalla. El
framework crea una instancia separada de WallpaperService.Engine
para cada
pantalla. Asegúrate de que la superficie de cada motor se dibuje de manera independiente. Desarrolladores
puedes cargar recursos usando el contexto de visualización en
WallpaperService.Engine#getDisplayContext()
Además, asegúrate de que tus
WallpaperInfo.xml
establece android:supportsMultipleDisplays="true"
.
Selectores
Una nueva categoría SECONDARY_HOME
de filtro de intents proporciona una actividad dedicada para las pantallas secundarias. Las instancias de esta actividad se utilizan en todas las pantallas que admiten decoraciones del sistema, una por cada pantalla.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
La actividad debe tener un modo de inicio que no impida múltiples instancias y que pueda adaptarse a diferentes tamaños de pantalla. El modo de lanzamiento no puede ser singleInstance
ni singleTask
.
Por ejemplo, la implementación de AOSP de Launcher3
admite un
SECONDARY_HOME
.
Métricas de la ventana
Android 11 (nivel de API 30) introdujo los siguientes métodos WindowManager
para proporcionar los límites de las apps que se ejecutan en el modo multiventana:
getCurrentWindowMetrics()
: Muestra un objetoWindowMetrics
para el estado actual de la renderización en ventanas del sistema.getMaximumWindowMetrics()
: MuestraWindowMetrics
para los valores más grandes el estado potencial de la renderización en ventanas del sistema.
Métodos computeCurrentWindowMetrics()
de la biblioteca de WindowManager de Jetpack
y computeMaximumWindowMetrics()
ofrecen una funcionalidad similar
respectivamente, pero con retrocompatibilidad hasta el nivel de API 14.
Para obtener métricas de pantallas que no sean la actual, haz lo siguiente: (como se muestra en el fragmento de código):
- Crea un contexto de visualización.
- Crea un contexto de ventana para la pantalla.
- Obtén el
WindowManager
del contexto de la ventana. - Obtén el
WindowMetrics
del área de visualización máxima disponible para la app.
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Métodos obsoletos
Los métodos getSize()
y getMetrics()
de Display
dejaron de estar disponibles en
Nivel de API 30 para favorecer los nuevos métodos WindowManager
.
En Android 12 (nivel de API 31), se darán de baja los métodos getRealSize()
y Display
getRealMetrics()
y actualiza su comportamiento para que coincida mejor con el
el comportamiento de getMaximumWindowMetrics()
.
Configuración del modo multiventana
Si tu app está orientada a Android 7.0 (nivel de API 24) o una versión posterior, puedes configurar cómo
y si las actividades de tu app
admiten el modo multiventana. Puedes configurar
atributos en tu manifiesto para controlar el tamaño y el diseño. El encabezado de una actividad raíz
de atributos se aplica a todas las actividades de su pila de tareas. Por ejemplo:
si la actividad raíz tiene android:resizeableActivity="true"
, entonces todas
de la pila de tareas puede cambiar de tamaño. En algunos dispositivos más grandes, como
En las Chromebooks, tu app podría ejecutarse en una ventana que puede cambiar de tamaño incluso si especificas
android:resizeableActivity="false"
Si esto hace que tu app falle, puedes usar
filtros de Google Play para restringir la disponibilidad de tu app en esos dispositivos.
Android 12 (nivel de API 31) establece de forma predeterminada el modo multiventana. En pantallas grandes
(clase de tamaño de ventana mediana o expandida); todas las apps se ejecutan en el modo multiventana
independientemente de la configuración de la app. En pantallas pequeñas, el sistema
minWidth
, minHeight
y resizeableActivity
de la actividad
para determinar si la actividad puede ejecutarse en el modo multiventana.
resizeableActivity
Establece este atributo en el <activity>
o la <application>
de tu manifiesto
para habilitar o inhabilitar el modo multiventana para el nivel de API 30 y versiones anteriores:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
Si este atributo se establece en true
, la actividad se puede iniciar en el modo de pantalla dividida.
y de formato libre. Si el atributo se establece en false
, la actividad no
admite el modo multiventana. Si el valor es falso, y el usuario intenta
inicia la actividad en el modo multiventana, esta tomará el control
en la pantalla.
Si tu app tiene como objetivo el nivel de API 24 o uno superior, pero no especificas un valor para este atributo, su valor predeterminado es verdadero.
Si tu aplicación tiene como objetivo el nivel de API 31 o uno superior, este atributo funciona diferente en Pantallas pequeñas y grandes:
- Pantallas grandes (clase de tamaño de ventana mediana o expandida): Todas las apps
admite el modo multiventana. El atributo indica si una actividad puede
que se puede cambiar de tamaño. Si es
resizeableActivity="false"
, la app se coloca en modo de compatibilidad cuando sea necesario para ajustarse a las dimensiones de la pantalla. - Pantallas pequeñas (clase de tamaño de ventana compacta): si
resizeableActivity="true"
y el ancho y la altura mínimos de la actividad cumplan con los requisitos del modo multiventana, la actividad admite el modo multiventana . Si esresizeableActivity="false"
, la actividad no se admite. modo multiventana, independientemente del ancho y la altura mínimos de la actividad.
supportsPictureInPicture
Establece este atributo en el nodo <activity>
de tu manifiesto para indicar si
la actividad admite el modo pantalla en pantalla.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Para controlar los cambios de configuración multiventana por tu cuenta, como cuando un usuario
cambia el tamaño de una ventana, agrega el atributo android:configChanges
a tu app
el nodo <activity>
del manifiesto con, al menos, los siguientes valores:
<activity
android:name=".MyActivity"
android:configChanges="screenSize | smallestScreenSize
| screenLayout | orientation" />
Después de agregar android:configChanges
, tu actividad y tus fragmentos recibirán un
devolución de llamada a onConfigurationChanged()
en lugar de destruirse y
recrearse. Luego, puedes actualizar manualmente las vistas, volver a cargar los recursos y
realizar otras operaciones según sea necesario.
<layout>
En Android 7.0 (nivel de API 24) y versiones posteriores, el elemento de manifiesto <layout>
admite varios atributos que afectan cómo se comporta una actividad en el modo multiventana
modo:
android:defaultHeight
,android:defaultWidth
: Altura y ancho predeterminados de la actividad cuando se la inicia en el modo de formato libre.android:gravity
: Es la ubicación inicial de la actividad cuando se la inicia en modo de formato libre. Consulta la claseGravity
para obtener valores adecuados.android:minHeight
,android:minWidth
: Altura y ancho mínimos para la actividad tanto en el modo de pantalla dividida como en el de formato libre. Si el usuario se mueve la línea divisoria en el modo de pantalla dividida para hacer que una actividad sea más pequeña que la mínimo especificado, el sistema recorta la actividad para que se adapte al tamaño que el usuario solicitudes.
El siguiente código muestra cómo especificar la ubicación y el tamaño predeterminados de una actividad, y su tamaño mínimo, cuando la actividad se visualiza en el modo de formato libre:
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end|..."
android:minHeight="450dp"
android:minWidth="300dp" />
</activity>
Modo multiventana en tiempo de ejecución
A partir de Android 7.0, el sistema ofrece funcionalidad para admitir apps que pueden ejecutarse en el modo multiventana.
Funciones inhabilitadas en el modo multiventana
En el modo multiventana, Android puede inhabilitar o ignorar funciones que no se aplican a una actividad que comparte la pantalla del dispositivo con otras actividades o apps.
Además, algunas opciones de personalización de la IU del sistema están inhabilitadas. Por ejemplo: Las apps no pueden ocultar la barra de estado si se están ejecutando en el modo multiventana (consulta Controla la visibilidad de la IU del sistema).
El sistema ignora los cambios del atributo android:screenOrientation
.
Consultas y devoluciones de llamadas del modo multiventana
La clase Activity
ofrece los siguientes métodos para admitir el modo multiventana
modo:
isInMultiWindowMode()
: Indica si la actividad se encuentra en modo multiventana.isInPictureInPictureMode()
: Indica si la actividad se encuentra en modo pantalla en pantalla.onMultiWindowModeChanged()
: El sistema llama a este método siempre que la la actividad entra en el modo multiventana o sale de él. El sistema pasa el método el valor true si la actividad ingresa al modo multiventana o false si La actividad sale del modo multiventana.onPictureInPictureModeChanged()
: El sistema llama a este método siempre que sea la actividad entra en el modo de pantalla en pantalla o sale de él. El sistema pasa al método un valor de true si la actividad ingresa al modo de pantalla en pantalla o false si la actividad sale del modo de pantalla en pantalla.
La clase Fragment
expone versiones de muchos de estos métodos. por ejemplo,
Fragment.onMultiWindowModeChanged()
Modo de pantalla en pantalla
Para activar el modo de pantalla en pantalla de una actividad, llama
enterPictureInPictureMode()
Este método no tiene efecto si el dispositivo
no es compatible con el modo de pantalla en pantalla. Para obtener más información, consulta el artículo Agrega videos con
pantalla en pantalla (PIP).
Nuevas actividades en el modo multiventana
Cuando inicias una nueva actividad, puedes indicar que la nueva actividad debe
junto a la actual, si es posible. Cómo usar la marca de intent
FLAG_ACTIVITY_LAUNCH_ADJACENT
, que le indica al sistema que intente crear
actividad nueva en una ventana adyacente, de modo que las dos actividades compartan la pantalla. El
sistema hace su mejor esfuerzo para hacerlo, pero no se garantiza que suceda.
Si un dispositivo está en modo de formato libre e inicias una nueva actividad, puedes
especificar las dimensiones y la ubicación de la pantalla de la nueva actividad llamando
ActivityOptions.setLaunchBounds()
El método no tiene efecto si el dispositivo
no está en el modo multiventana.
En el nivel de API 30 y en versiones anteriores, si inicias una actividad dentro de una pila de tareas, la reemplaza a la que se muestra en pantalla y hereda todas sus funciones propiedades. Si quieres iniciar la nueva actividad como una ventana independiente en el modo multiventana, debes iniciarlo en una nueva pila de tareas.
Android 12 (nivel de API 31) permite que las apps dividan la ventana de tareas de una aplicación entre varias actividades. Tú determinas cómo muestra tu app en pantalla completa, una al lado de la otra o apiladas, mediante la creación de Terraform o realizar llamadas a la API de Jetpack WindowManager.
Arrastrar y soltar
Los usuarios pueden arrastrar y soltar datos de una actividad a otra mientras las dos actividades comparten la pantalla. (Antes de Android 7.0, los usuarios solo podían arrastrar
y soltarlos en una sola actividad). Para agregar rápidamente compatibilidad para aceptar
el contenido soltado verá la API de DropHelper
. Para una acción integral de arrastrar y soltar
guía, consulta Cómo habilitar la función de arrastrar y soltar.
Instancias múltiples
Cada actividad raíz tiene su propia tarea, que se ejecuta en un proceso independiente y se muestra en su propia ventana. Para iniciar una instancia nueva de tu app en otra ventana, puedes iniciar actividades nuevas con la marca FLAG_ACTIVITY_NEW_TASK
. Tú
puedes combinar esto con algunos de los atributos de multiventana para solicitar
una ubicación específica para la nueva ventana. Por ejemplo, una app de compras puede mostrar varias ventanas para comparar productos.
Android 12 (nivel de API 31) te permite iniciar dos instancias de una actividad una al lado de la otra en la misma ventana de tareas.
Si quieres permitir que los usuarios inicien otra instancia de tu aplicación desde
en el selector de aplicaciones o en la barra de tareas, asegúrate de que la actividad de tu selector
configura android:resizeableActivity="true"
y no usa un modo de lanzamiento que
evita múltiples instancias. Por ejemplo, una actividad singleInstancePerTask
puede
se les pueden crear instancias varias veces en diferentes tareas cuando
Se estableció FLAG_ACTIVITY_MULTIPLE_TASK
o FLAG_ACTIVITY_NEW_DOCUMENT
.
No confundas las instancias múltiples con un diseño de varios paneles, como lista-detalles
que usa SlidingPaneLayout
, que se ejecuta en un solo
en la ventana modal.
Ten en cuenta que cuando varias instancias se ejecutan en ventanas separadas en un dispositivo plegable, se pueden enviar una o más instancias a segundo plano si cambia la posición. Por ejemplo, supongamos que un dispositivo está expandido y tiene dos instancias de apps ejecutándose en dos ventanas a ambos lados de la mitad superior. Si el dispositivo está plegado, una de las instancias podría finalizar en lugar de intentar ajustarse a las ventanas de ambas instancias en una pantalla más pequeña.
Verificación del modo multiventana
Independientemente de si tu aplicación se orienta o no al nivel de API 24 o superior, debes verificar cómo se comporta en el modo multiventana en caso de que un usuario intente iniciarlo en ese modo. en un dispositivo con Android 7.0 o una versión posterior.
Dispositivos de prueba
Los dispositivos que ejecutan Android 7.0 (nivel de API 24) o versiones posteriores admiten el modo multiventana.
Nivel de API 23 o versiones anteriores
Cuando el usuario intenta usar la app en el modo multiventana, el sistema cambia el tamaño de la app de manera forzosa a menos que esta declare una orientación fija.
Si tu app no declara una orientación fija, debes iniciarla en un dispositivo con Android 7.0 o superior e intentar instalar la app modo de pantalla dividida. Verifica que la experiencia del usuario sea aceptable cuando la aplicación cambiar el tamaño de manera forzosa.
Si la app declara una orientación fija, debes intentar colocarla en el modo multiventana. Cuando lo hagas, verifica que la app continúe en el modo de pantalla completa.
Niveles de API 24 a 30
Si tu app está orientada desde el nivel de API 24 hasta el 30 y no inhabilita la compatibilidad con el modo multiventana, verifica el siguiente comportamiento tanto en el modo de pantalla dividida como en el de formato libre:
Inicia la app en pantalla completa y, luego, cambia al modo multiventana. Mantén presionado el botón Recents. Verifica que la app pase de un modo al otro correctamente.
Inicia la app directamente en el modo multiventana y verifica que la app se inicia correctamente. Para iniciar una app en el modo multiventana, presiona el botón Recientes y, luego, mantén presionada la barra de título de la app y arrastrándola a una de las áreas resaltadas de la pantalla.
Cambia el tamaño de tu app en el modo de pantalla dividida arrastrando la línea divisoria de la pantalla. Verificar que la app cambie de tamaño sin fallar y que se muestren los elementos necesarios de la IU sean visibles.
Si especificaste dimensiones mínimas para tu aplicación, intenta cambiar el tamaño del para que el tamaño de la ventana sea menor que esas dimensiones. Verifica lo siguiente: No puedes cambiar el tamaño de la app para que sea más pequeña que el mínimo especificado dimensiones.
En todas las pruebas, verifica que el rendimiento de la app sea aceptable. Para Por ejemplo, verifica que la actualización de la IU no demore mucho después de el tamaño de la app.
Nivel de API 31 o versiones posteriores
Si tu app tiene como objetivo el nivel de API 31 o uno superior, y el ancho mínimo de la actividad principal y altura mínima sean inferiores o iguales a las dimensiones respectivas de la área de visualización disponible, verifica todos los comportamientos enumerados para los niveles de API 24 hasta 30.
Lista de tareas de prueba
Para verificar el rendimiento de tu app en el modo multiventana, realiza las siguientes operaciones. Debes probar estas operaciones tanto en el modo de pantalla dividida como en el modo de formato libre, excepto cuando se indique algo diferente.
Ingresa en el modo multiventana y luego sal.
Pasa de tu app a otra y verifica que la app se comporte correctamente mientras está visible, pero no activa. Por ejemplo, si tu app está reproduciendo un video, verifique que se siga reproduciendo mientras el usuario interactuar con otra aplicación.
En el modo de pantalla dividida, prueba mover la línea divisoria de la pantalla para que tu app cada vez más pequeño. Intenta realizar estas operaciones una al lado de la otra y una superior las demás configuraciones. Verifica que la app no falle, esencial esté visible y la operación de cambio de tamaño no tarde mucho.
Realiza varias operaciones de cambio de tamaño en una sucesión rápida. Verifica que la app no falle ni pierda memoria. El Generador de perfiles de memoria de Android Studio información sobre el uso de memoria de tu app (consulta Cómo inspeccionar la memoria de tu app) con el Generador de perfiles de memoria).
Usa tu app normalmente en diferentes configuraciones de ventanas. verificar que la app se comporte correctamente. Verifica que el texto sea legible y que Los elementos de la IU no son demasiado pequeños para interactuar con ellos.
Inhabilitación de la compatibilidad con el modo multiventana
En los niveles de API 24 a 30, si inhabilitaste la compatibilidad con el modo multiventana configurando
android:resizeableActivity="false"
, debes iniciar tu app en un dispositivo
con Android 7.0 a 11 e intentar colocar la app en el modo de pantalla dividida y
modos de formato libre. Cuando lo hagas, verifica que la app permanezca en pantalla completa.
.
Recursos adicionales
Si deseas obtener más información sobre la compatibilidad con el modo multiventana en Android, consulta:
- Muestra de MultiWindowPlayground para Android
Recomendadas para ti * Nota: El texto del vínculo se muestra cuando JavaScript está desactivado. * Modo de compatibilidad de dispositivos * Admite la posibilidad de cambiar el tamaño de las pantallas grandes. * Manejar los cambios en la configuración