Apps para dispositivos plegables y con varias pantallas
En general, las apps no deben depender de identificadores estáticos ni de lógica que dependa de algunos IDs de pantalla. En la mayoría de los casos, las apps deberían cambiar de tamaño y funcionar en diferentes pantallas, y el sistema debería controlar dónde ubicarlas. Por ejemplo, para crear una experiencia nueva y única para dispositivos plegables y lanzar una app especial en la pantalla externa cuando el dispositivo está plegado.
En este caso, SystemUI (o algún otro componente del sistema) debe detectar el pliegue, determinar si es adecuado realizar una acción y, luego, iniciar la actividad de destino y especificar un ID de pantalla externa como destino de inicio. Las apps no deben detectar esta acción ni realizar ninguna acción en respuesta, y luego deben realizar el lanzamiento en una pantalla específica. En otras palabras, no supongas que lo que funciona en un dispositivo funcionará en otros. En resumen, el código específico del dispositivo aumenta la fragmentación.
Restringe el acceso a las pantallas
Si la configuración del dispositivo requiere restringir el acceso a una o más pantallas, se recomienda usar la marca Display#FLAG_PRIVATE
para designar esas pantallas como privadas. Si lo haces, se restringirá la capacidad de agregar contenido a la pantalla, excepto para el propietario. Cualquier intento de iniciar una actividad o agregar una ventana por parte de cualquier persona que no sea el propietario genera un SecurityException
.
Si el sistema es propietario de la pantalla, puede agregar ventanas y lanzar actividades.
Además, las entidades que se colocan en una pantalla siempre pueden acceder a ella. Si el propietario inicia una actividad en una pantalla, esta puede iniciar otras actividades en la misma pantalla. Por lo tanto, el propietario es responsable de restringir el acceso y permitir solo las apps de confianza.
Además, se agregan más restricciones a las pantallas virtuales porque cualquier app puede crear una sin que sea visible para el usuario. Si la pantalla virtual no es propiedad del sistema, solo se permiten las actividades con allowEmbedded
, y el llamador debe tener el permiso ACTIVITY_EMBEDDING
.
Para obtener más información, consulta:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Para controlar de forma condicional los inicios de actividades, usa LaunchParamsController
, que intercepta todos los inicios de actividades y permite que un componente del sistema modifique los parámetros que se usan para el inicio. Esta opción está disponible en system_server
.
Cómo configurar los ajustes de ventanas de la pantalla y las decoraciones del sistema
Las decoraciones del sistema se pueden configurar por pantalla en DisplayWindowSettings
. Una implementación de dispositivo puede proporcionar una configuración predeterminada en /data/system/display_settings.xml
.
Este valor determina si las decoraciones del sistema (launcher, fondo de pantalla, barra de navegación y otras ventanas de decoración) y el IME aparecen en una pantalla.
Para obtener más información, consulta DisplayWindowSettings#shouldShowSystemDecorsLocked()
y DisplayWindowSettings#shouldShowImeLocked()
.
Para identificar la pantalla, usa un ID único (este valor predeterminado usa DisplayInfo#uniqueId
) o un ID de puerto físico para las pantallas de hardware (consulta 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, se usa uniqueId
para la identificación de la pantalla en el atributo name, que para una pantalla simulada es overlay:1
.
En el caso de 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 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, consulta Identificadores de pantalla estáticos.
Para obtener más información, consulta: