Prácticas recomendadas

Apps para dispositivos plegables y multipantalla

Por lo general, las aplicaciones no deben basarse en identificadores estáticos ni en lógica que algunos IDs de pantalla. En la mayoría de los casos, las apps deben cambiar de tamaño y funcionar en pantallas diferentes. y el sistema debería controlar dónde ubicar las apps. 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 supongas 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 cualquiera excepto por el propietario genera una SecurityException. Si el sistema es el 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. 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, uniqueId se usa para la identificación de pantalla. en el atributo de nombre, 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: