Modo de ventana de forma libre de Android Nougat: qué es y cómo pueden utilizarlo los desarrolladores

El modo de múltiples ventanas de forma libre es una característica subutilizada y subestimada en Android Nougat. Te explicamos qué es y cómo los desarrolladores pueden incorporarlo.

Modo de ventana de forma libre, como lo demostró por primera vez Ars Técnica

Cuando Android 7.0 Nougat se anunció por primera vez a principios de 2016, trajo consigo una característica muy solicitada para la plataforma Android: la compatibilidad con múltiples ventanas. La mayoría de las personas conocen la compatibilidad con ventanas múltiples de pantalla dividida habilitada de forma predeterminada en todos los teléfonos y tabletas con Android Nougat. Los dispositivos Android TV con Android Nougat son compatibles con múltiples ventanas de imagen en imagen.

Sin embargo, hay un tercer modo de ventanas múltiples presente en Android Nougat que no mucha gente conoce: modo de ventana de forma libre. Este modo permite a Android presentar aplicaciones como ventanas flotantes que el usuario puede mover y cambiar de tamaño a voluntad. Es esencialmente la implementación de Android de un

administrador de ventanas apilables.

En el Documentación del SDK de Android, se afirma que:

Los fabricantes de dispositivos más grandes pueden optar por habilitar el modo de forma libre, en el que el usuario puede cambiar libremente el tamaño de cada actividad. Si el fabricante habilita esta función, el dispositivo ofrece el modo de forma libre además del modo de pantalla dividida.

Y también, en el Android 7.0 CDD:

Las implementaciones de dispositivos con tamaño de pantalla extragrande DEBEN admitir el modo de forma libre.

Esto indica que cualquier dispositivo Android de pantalla grande nuevo que se envíe con Android 7.0 podría tener el modo de ventana de forma libre habilitado por el fabricante.

Sin embargo, esto no es en absoluto un requisito estricto. Es posible forzar cualquier Dispositivo Android Nougat (con opciones de desarrollador habilitadas) para admitir el modo de ventana de forma libre mediante uno de dos métodos diferentes:


Habilitar el modo de ventana de forma libre en cualquier dispositivo Android Nougat

Activar la opción "Forzar que las actividades cambien de tamaño" permite que las aplicaciones se ejecuten en modo libre en cualquier dispositivo

Método 1 (se requiere una computadora con adb)

Asegúrese de que la depuración de USB esté habilitada en Opciones de desarrollador. Luego, conecte su dispositivo a una computadora con adb instalado y ejecute el siguiente comando:

adb shell settings put global enable_freeform_support 1

Método 2 (sin requisitos adicionales)

Habilite la opción "Forzar que las actividades cambien de tamaño" en la parte inferior de Opciones de desarrollador.

Ambos métodos requieren que se reinicie la interfaz de usuario del sistema antes de que puedan surtir efecto. La forma más sencilla de hacerlo es reiniciar su dispositivo (o, si su dispositivo está rooteado, simplemente puede eliminar el com.android.systemui proceso)


Bien, entonces el modo de forma libre está habilitado... ¿y ahora qué?

Si habilitó el modo de forma libre usando el Método 1, habrá un nuevo botón en las entradas de la aplicación en el menú Descripción general para iniciar una aplicación en el modo de ventana de forma libre.

Sin embargo, con el Método 2, no es posible iniciar una aplicación en modo libre a través del propio Android. Afortunadamente, Es posible que cualquier iniciador de terceros inicie una aplicación en modo de ventana de forma libre. utilizando API estándar de Android que se finalizaron como parte del nivel de API 24.

La clave para iniciar una aplicación en modo libre es llamar al ActivityOptions.setLaunchBounds() método. Este método requiere un Rect como argumento, que contiene los límites de la ventana con la que se iniciará la aplicación.

Luego puede iniciar la aplicación con startActivity(Intent, Bundle). Si aún no tienes un ActivityOptions paquete, puedes crear uno con ActivityOptions.makeBasic() y luego llamando setLaunchBounds() en el paquete recién creado.

Tenga en cuenta que, de forma predeterminada, si ya hay una tarea para la aplicación presente en la pantalla Descripción general, entonces Android simplemente lo redireccionará a la tarea existente (pantalla completa) que fue iniciada previamente por el usuario. Deberá borrar todas las tareas de la aplicación en Descripción general antes de intentar iniciar la aplicación en una ventana de formato libre. (Para aplicaciones con actividades que se inician en standard o singleTop modos, puede forzar la apertura de una nueva ventana agregando el Intent.FLAG_ACTIVITY_MULTIPLE_TASK marcar la intención antes de llamar startActivity().)


¿Cómo funciona el modo de forma libre bajo el capó?

Hay un excelente articulo escrito que explica cómo se implementa el modo de ventanas múltiples, incluido el modo de forma libre, en Android Nougat. (NOTA: el artículo está escrito en chino, así que asegúrese de ejecutarlo en Google Translate)

En pocas palabras, las aplicaciones en modo libre se ejecutan en una pila separada del resto del sistema (piense en un escritorio virtual). Por lo tanto, no es posible que aplicaciones de formato libre se ejecuten sobre el iniciador o sobre otra aplicación de pantalla completa.

Aplicaciones que se ejecutan en modo de forma libre (que no tienen android: windowIsFloating establecido en verdadero) tiene un DecorCaptionView agregado como hijo del nivel superior DecorView. Esta vista contiene una LinearLayout definir la barra de títulos de la ventana para mover, maximizar y cerrar la ventana. Si bien no lo recomiendo personalmente, es posible acceder y personalizar esta vista obteniendo el DecorView usando Window.getDecorView(), transmitiéndolo a un ViewGroup y luego acceder a sus vistas secundarias.

Cualquier aplicación diseñada para comportarse bien en el modo multiventana de pantalla dividida estándar de Android funcionará en modo libre. isInMultiWindowMode() devolverá verdadero para las aplicaciones que se ejecutan en modo de forma libre. Hay algunas otras clases y métodos disponibles públicamente que una aplicación puede usar y que se relacionan específicamente con el modo de forma libre:

  • Window.setDecorCaptionShade(): este método se puede utilizar para anular el tono de los controles de subtítulos (el botón maximizar y cerrar) para aplicaciones en modo de forma libre.
  • Window.setRestrictedCaptionAreaListener(): esto se puede utilizar para detectar cuándo se mueve una ventana en modo de forma libre. El Window.OnRectrictedCaptionAreaChangedListener se llama cada vez que cambia la posición de los controles de subtítulos (cuando un usuario mueve la ventana) y proporciona una Rect con los nuevos límites de los controles de títulos.
  • ActivityInfo.WindowLayout: esta clase contiene información declarada en el manifiesto de la aplicación en cuanto a la posición inicial de una ventana de forma libre que una aplicación puede solicitar al iniciarse. Por ejemplo, puede enumerar lo siguiente en el etiqueta de su manifiesto:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Luego, cuando el dispositivo ya esté en modo de forma libre y se inicie la aplicación, se iniciará con estos límites especificados.

Ejemplos de modo de ventana de forma libre en acción

La barra de tareas agrega un menú de inicio y una bandeja de aplicaciones recientes para complementar el modo de ventana de forma libre

En el verano de 2016, mientras Android Nougat todavía era una vista previa para desarrolladores, lancé una aplicación llamada Barra de tareas que proporciona un menú de inicio similar a Windows y una lista de aplicaciones recientes en una superposición del sistema. Permite a los usuarios de Nougat iniciar aplicaciones en modo de ventana de forma libre y, dado que la barra de tareas usa una superposición, puede permanecer en la pantalla en el entorno de ventana de forma libre. La combinación de la barra de tareas y el modo de forma libre le da a cualquier dispositivo Android, especialmente a las tabletas, una sensación similar a la de una PC.

Puede descargar barra de tareas en Google Play, o ver el código fuente usted mismo en GitHub. Además de los conceptos mencionados en este artículo, también empleo algunos trucos para mantener activo el entorno del modo de forma libre incluso cuando no se muestran ventanas de forma libre en la pantalla. Opcionalmente, los usuarios también pueden configurar la barra de tareas como su iniciador predeterminado para permitir que su dispositivo se inicie automáticamente en el entorno del modo de forma libre.

Dado que no hay dispositivos que se envíen oficialmente con soporte para ventanas de forma libre habilitado por el OEM (al momento de escribir este artículo), recomiendo usar la barra de tareas como herramienta para que los desarrolladores prueben sus aplicaciones en el entorno de ventana de forma libre en dispositivos que de otro modo no serían compatibles él.

Además de la barra de tareas, también modifiqué el código fuente de Launcher3 de AOSP para permitirle iniciar aplicaciones en modo de forma libre. Este es un clon directo del lanzador estándar de Android 7.1.1, con las modificaciones mínimas necesarias para permitirle iniciar aplicaciones de formato libre. Proporcioné este iniciador modificado con la esperanza de que otros desarrolladores implementen soporte para iniciar ventanas de forma libre en sus iniciadores personalizados. Puede ver el código fuente en GitHub, o descargar un APK de muestra.

Mi esperanza es que los desarrolladores de lanzadores personalizados puedan utilizar este código y habilitar el soporte para el lanzamiento de forma libre. aplicaciones de ventana para aquellos usuarios que desean una mayor flexibilidad para la gestión de ventanas en sus pantallas grandes dispositivos.