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

Modo de ventana de forma libre, como lo demostró por primera vez Ars Technica

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

Sin embargo, hay un tercer modo de ventanas múltiples presente en Android Nougat que no mucha gente conoce: el modo de ventana de forma libre . Este modo permite que Android presente 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 de apilamiento.

En la documentación del SDK de Android, establece que:

Los fabricantes de dispositivos más grandes pueden optar por habilitar el modo de forma libre, en el que el usuario puede cambiar el tamaño libremente 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 xlarge DEBERÍAN admitir el modo de forma libre.

Esto indica que cualquier nuevo dispositivo Android de pantalla grande 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 absolutamente un requisito difícil. Es posible forzar a cualquier dispositivo Android Nougat (con opciones de desarrollador habilitadas) para que admita el modo de ventana de forma libre utilizando 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 sean redimensionables" permite que las aplicaciones se ejecuten en modo de forma 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 sean redimensionables" en la parte inferior de Opciones de desarrollador.

Ambos métodos requieren que se reinicie la IU del sistema antes de que surtan efecto. La forma más fácil de hacer esto es reiniciar su dispositivo (o, si su dispositivo está rooteado, simplemente puede matar el proceso com.android.systemui )


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

Si habilitó el modo de forma libre utilizando 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 de forma libre a través de Android. Afortunadamente, es posible que cualquier iniciador de terceros inicie una aplicación en modo de ventana de forma libre utilizando API de Android estándar que se finalizaron como parte del nivel 24 de API.

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

Luego puede iniciar la aplicación con startActivity(Intent, Bundle) . Si aún no tiene un paquete ActivityOptions, puede crear uno con ActivityOptions.makeBasic() y luego llamar a 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, Android simplemente lo redirigirá a la tarea existente (pantalla completa) que el usuario inició anteriormente. Deberá borrar todas las tareas de la aplicación en Descripción general antes de intentar iniciar la aplicación en una ventana de forma libre. (Para las aplicaciones con actividades que se singleTop modos standard o singleTop, puede forzar una nueva ventana para abrir agregando el indicador Intent.FLAG_ACTIVITY_MULTIPLE_TASK a la intención antes de llamar a startActivity() .


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

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

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

Las aplicaciones que se ejecutan en modo de forma libre (que no tienen android:windowIsFloating establecido en verdadero) tienen un DecorCaptionView agregado como elemento secundario del DecorView nivel DecorView . Esta vista contiene un LinearLayout define la barra de subtí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(), ViewGroup a un ViewGroup y luego accediendo a sus vistas secundarias.

Cualquier aplicación que esté diseñada para funcionar bien en el modo estándar de múltiples ventanas de pantalla dividida de Android funcionará en modo de forma 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 que se relacionan específicamente con el modo de forma libre:

  • Window.setDecorCaptionShade() : este método se puede utilizar para anular la sombra de los controles de subtítulos (el botón maximizar y cerrar) para aplicaciones en modo de forma libre.
  • Window.setRestrictedCaptionAreaListener() : esto se puede usar para detectar cuándo una ventana se mueve en modo de forma libre. Se llama a Window.OnRectrictedCaptionAreaChangedListener cada vez que cambia la posición de los controles de subtítulos (cuando un usuario mueve la ventana) y proporciona un Rect con los nuevos límites de los controles de subtítulos.
  • ActivityInfo.WindowLayout : esta clase contiene información declarada en el manifiesto de la aplicación sobre el posicionamiento inicial de una ventana de forma libre que una aplicación puede solicitar al iniciar. Por ejemplo, puede enumerar lo siguiente en el etiqueta de su manifiesto:

    Luego, cuando el dispositivo ya está en modo de forma libre y se inicia 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 del desarrollador, lancé una aplicación llamada Taskbar 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 el modo de ventana de forma libre y, dado que la barra de tareas utiliza una superposición, puede permanecer en la pantalla en el entorno de la 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 tabletas, una sensación de PC.

Puede descargar la 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 utilizo algunos trucos para mantener activo el entorno del modo de forma libre incluso cuando no se muestran ventanas de forma libre en la pantalla. Los usuarios también pueden configurar opcionalmente la Barra de tareas como su iniciador predeterminado para permitir que su dispositivo arranque automáticamente en el entorno del modo de forma libre.

Dado que no hay dispositivos que se envíen oficialmente con soporte de ventana de forma libre habilitado por el OEM (a partir de este escrito), recomiendo usar Taskbar como herramienta para que los desarrolladores prueben sus aplicaciones en el entorno de ventana de forma libre en dispositivos que de otro modo no lo admiten .

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 iniciador de Android 7.1.1, con las mínimas modificaciones necesarias para permitirle iniciar aplicaciones de forma libre. He proporcionado este lanzador modificado con la esperanza de que otros desarrolladores implementen soporte para lanzar ventanas de forma libre en sus lanzadores personalizados. Puede ver el código fuente en GitHub o descargar un APK de muestra.

Espero que los desarrolladores de lanzadores personalizados puedan utilizar este código y habilitar el soporte para lanzar aplicaciones de ventana de forma libre para aquellos usuarios que desean una mayor flexibilidad para la administración de ventanas en sus dispositivos de pantalla grande.