Apps para dispositivos plegables y multipantalla
Por lo general, las apps no deben depender de identificadores estáticos ni de una lógica que dependa de algunos IDs de visualización. En la mayoría de los casos, las apps deben cambiar de tamaño y funcionar en diferentes pantallas, y el sistema debe controlar dónde ubicarlas. Por ejemplo, para crear un una experiencia nueva y única para dispositivos plegables, y lanza una app especial en la pantalla externa cuando el dispositivo está plegado.
En este caso, SystemUI (u otro componente del sistema) debería detectar el de la línea de plegado, determina si es apropiado realizar una acción y, luego, inicia la la actividad objetivo y especificar un ID de pantalla externo como objetivo de inicio. Las apps no deberían detectar esta acción ni realizar ninguna acción como respuesta. realizar el inicio en una pantalla específica. En otras palabras, no des por sentado que lo que funciona en un dispositivo funcionará en otros. En resumen, las aplicaciones el código aumenta la fragmentación.
Restringir el acceso a pantallas
Si la configuración del dispositivo requiere la restricción de acceso a uno o más
se recomienda usar la marca Display#FLAG_PRIVATE
para designar esas pantallas como privadas. Esto restringe todas las funciones,
propietario para que no agregue contenido a la pantalla. Cualquier intento de iniciar una actividad o de agregar una ventana por parte de alguien que no sea el propietario genera un SecurityException
.
Si el sistema es propietario de la pantalla, puede agregar ventanas e iniciar actividades.
Además, las entidades ubicadas en una pantalla siempre pueden acceder a ella. Si el propietario inicia una actividad en una pantalla, esta puede iniciar otras las actividades en esta pantalla. Por eso, el propietario es responsable de restringir y permitir el acceso únicamente a las apps de confianza.
Además, se agregan más restricciones a las pantallas virtuales, ya que cualquier app puede
crear uno sin que sea visible para el usuario. Si la pantalla virtual no está
propiedad del sistema, solo las actividades con
allowEmbedded
están permitidos y la persona que llama debe tener el ACTIVITY_EMBEDDING
permiso.
Para obtener más información, consulta:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Para controlar condicionalmente los inicios de actividades, usa LaunchParamsController
.
que intercepta todos los inicios de actividades y permite que un componente del sistema modifique la
que se usan para el lanzamiento. Esta función está disponible en system_server
.
Cómo definir la configuración de la renderización en ventanas y la decoración del sistema
Las decoraciones del sistema pueden
se configurarán por pantalla en DisplayWindowSettings
. Un dispositivo
su implementación puede proporcionar una configuración predeterminada en
/data/system/display_settings.xml
Este valor determina si las decoraciones del sistema (selector, fondo de pantalla,
la barra de navegación y otras ventanas de decoración) y el IME en una pantalla.
Para obtener más información, consulta DisplayWindowSettings#shouldShowSystemDecorsLocked()
.
y DisplayWindowSettings#shouldShowImeLocked()
.
Para identificar la pantalla, utiliza un ID único (esta configuración predeterminada usa
DisplayInfo#uniqueId
) o un ID de puerto físico para hardware
(consulta DisplayInfo#address
).
El siguiente ejemplo de configuración de visualización 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 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 correspondan a DisplayWindowSettings#IDENTIFIER_PORT
y, luego, actualizar
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 visualización estáticos.
Para obtener más información, consulta: