Prácticas Recomendadas

Apps para dispositivos plegables y multipantalla

En general, las aplicaciones no deben depender de identificadores estáticos o de una lógica que dependa de algunas ID de pantalla. En la mayoría de los casos, las aplicaciones deben cambiar de tamaño y funcionar en diferentes pantallas y el sistema debe controlar dónde ubicar las aplicaciones. Por ejemplo, para crear una experiencia nueva y única para dispositivos plegables e iniciar una aplicación especial en la pantalla externa cuando el dispositivo está plegado.

En este caso, SystemUI (u otro componente del sistema) debe detectar el pliegue, determinar si es apropiado realizar una acción y luego iniciar la actividad de destino y especificar una ID de pantalla externa como destino de inicio. Las aplicaciones no deberían detectar esta acción ni realizar ninguna acción en respuesta y luego realizar el inicio en una pantalla específica. En otras palabras, no asuma que lo que funciona en un dispositivo funcionará en otros dispositivos. En resumen, el código específico del dispositivo aumenta la fragmentación.

Restricción del acceso a las pantallas

Si la configuración del dispositivo requiere la restricción de acceso a una o más pantallas, la recomendación es usar el indicador Display#FLAG_PRIVATE para designar dichas pantallas como privadas . Si lo hace, restringe a todos, excepto al propietario, de agregar contenido a la pantalla. Cualquier intento de iniciar una actividad o agregar una ventana por parte de alguien que no sea el propietario da como resultado una excepción de SecurityException . Si el sistema posee la pantalla, el sistema puede agregar ventanas e iniciar actividades.

Además, las entidades colocadas en una pantalla siempre pueden acceder a esa pantalla. Si el propietario inicia una actividad en una pantalla, la actividad puede iniciar otras actividades en esta pantalla. Como resultado, el propietario es responsable de restringir el acceso y permitir solo las aplicaciones de confianza.

Además, se agregan más restricciones a las pantallas virtuales porque cualquier aplicación puede crear una sin que sea visible para el usuario. Si la pantalla virtual no es propiedad del sistema, solo se permiten actividades con allowEmbedded y la persona que llama debe tener el permiso ACTIVITY_EMBEDDING .

Para más información, ver:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

Para controlar de forma condicional los lanzamientos de actividades, use LaunchParamsController , que intercepta todos los lanzamientos de actividades y permite que un componente del sistema modifique los parámetros utilizados para el lanzamiento. Esto está disponible en system_server .

Configuración de los ajustes de las ventanas de visualización y las decoraciones del sistema

Las decoraciones del sistema se pueden configurar por pantalla en DisplayWindowSettings . La implementación de un dispositivo puede proporcionar una configuración predeterminada en /data/system/display_settings.xml .

Este valor determina si las decoraciones del sistema (lanzador, papel tapiz, barra de navegación y otras ventanas decorativas) y el IME aparecen en una pantalla. Para obtener más información, consulta DisplayWindowSettings#shouldShowSystemDecorsLocked() y DisplayWindowSettings#shouldShowImeLocked() .

Para identificar la pantalla, use una identificación única (este valor predeterminado usa DisplayInfo#uniqueId ) o una identificación de puerto físico para pantallas de hardware (consulte DisplayInfo#address ).

Por ejemplo, el siguiente ejemplo de configuración de pantalla habilita las decoraciones del sistema y el IME en una pantalla simulada:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="0" />
<display
  name="overlay:1"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

En el ejemplo anterior, uniqueId se usa para la identificación de visualización en el atributo de nombre, que para una visualización simulada es overlay:1 . Para una pantalla integrada, un valor de muestra puede ser "local:45354385242535243453" . Otra opción es usar la información del puerto de hardware y establecer el identifier="1" para que corresponda a DisplayWindowSettings#IDENTIFIER_PORT y luego actualizar el nombre para usar el formato "port:<port_id>" :

<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="1" />
<display
  name="port:12345"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Para obtener más información, consulte Identificadores de visualización estáticos .

Para más información, ver: