Prácticas recomendadas

Aplicaciones para dispositivos plegables y multipantalla

Generalmente, las aplicaciones no deben depender de identificadores estáticos o de una lógica que dependa de algunos ID de visualización. 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 lanzamiento. 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. En resumen, el código específico del dispositivo aumenta la fragmentación.

Restringir el acceso a las pantallas

Si la configuración del dispositivo requiere la restricción del acceso a una o más pantallas, la recomendación es utilizar el indicador Display#FLAG_PRIVATE para designar dichas pantallas como privadas . Hacerlo impide que todos, excepto el propietario, agreguen contenido a la pantalla. Cualquier intento de iniciar una actividad o agregar una ventana por parte de cualquier persona que no sea el propietario da como resultado una 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, entonces la actividad puede iniciar otras actividades en esta pantalla. Como resultado, el propietario es responsable de restringir el acceso y permitir únicamente aplicaciones confiables.

Además, se añaden 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 condicionalmente 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 .

Configurar 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 (iniciador, fondo de pantalla, barra de navegación y otras ventanas decorativas) y el IME aparecen en una pantalla. Para obtener más información, consulte DisplayWindowSettings#shouldShowSystemDecorsLocked() y DisplayWindowSettings#shouldShowImeLocked() .

Para identificar la pantalla, use una ID única (este valor predeterminado usa DisplayInfo#uniqueId ) o una ID 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 utiliza 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 configurar 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: