Pratiques recommandées

Applis pour appareils pliables et multi-écrans

En règle générale, les applications ne doivent pas s'appuyer sur des identifiants ou une logique statiques qui dépendent de certains ID d'écran. Dans la plupart des cas, les applications doivent se redimensionner et fonctionner sur différents écrans, et le système doit contrôler l'emplacement des applications. Par exemple, pour créer une expérience nouvelle et unique pour les appareils pliables et lancer une application spéciale sur l'écran externe lorsque l'appareil est plié.

Dans ce cas, SystemUI (ou un autre composant système) doit détecter le pli, déterminer s'il est approprié d'effectuer une action, puis lancer l'activité cible et spécifier un ID d'écran externe comme cible de lancement. Les applications ne doivent pas détecter cette action ni effectuer aucune action en réponse, puis effectuer le lancement sur un écran spécifique. En d'autres termes, ne partez pas du principe que ce qui fonctionne sur un appareil fonctionnera aussi sur d'autres. En bref, le code spécifique à l'appareil augmente la fragmentation.

Limiter l'accès aux écrans

Si la configuration de l'appareil nécessite de limiter l'accès à un ou plusieurs écrans, nous vous recommandons d'utiliser l'option Display#FLAG_PRIVATE pour désigner ces écrans comme privés. Cela empêche tous les utilisateurs, sauf le propriétaire, d'ajouter du contenu à l'écran. Toute tentative de lancement d'une activité ou d'ajout d'une fenêtre par une personne autre que le propriétaire entraîne une SecurityException. Si le système est propriétaire de l'écran, il peut ajouter des fenêtres et lancer des activités.

De plus, les entités placées sur un écran peuvent toujours y accéder. Si le propriétaire lance une activité sur un écran, celle-ci peut lancer d'autres activités sur cet écran. Par conséquent, le propriétaire est tenu de restreindre l'accès et d'autoriser uniquement les applications de confiance.

De plus, des restrictions supplémentaires sont ajoutées aux écrans virtuels, car n'importe quelle application peut en créer un sans le rendre visible à l'utilisateur. Si l'écran virtuel n'appartient pas au système, seules les activités avec allowEmbedded sont autorisées et l'appelant doit disposer de l'autorisation ACTIVITY_EMBEDDING.

Pour en savoir plus, voir :

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

Pour contrôler de manière conditionnelle le lancement d'activités, utilisez LaunchParamsController, qui intercepte tous les lancements d'activités et permet à un composant système de modifier les paramètres utilisés pour le lancement. Disponible dans system_server.

Configurer les paramètres de fenêtre d'affichage et les décorations système

Les décorations système peuvent être configurées par écran dans DisplayWindowSettings. Une implémentation d'appareil peut fournir une configuration par défaut dans /data/system/display_settings.xml.

Cette valeur détermine si les décorations système (lanceur, fond d'écran, barre de navigation et autres fenêtres de décoration) et le IME s'affichent. Pour en savoir plus, consultez DisplayWindowSettings#shouldShowSystemDecorsLocked() et DisplayWindowSettings#shouldShowImeLocked().

Pour identifier l'écran, utilisez un identifiant unique (par défaut, DisplayInfo#uniqueId) ou un ID de port physique pour les écrans matériels (voir DisplayInfo#address).

L'exemple de configuration d'affichage suivant active les décorations système et l'IME sur un affichage simulé:

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

Dans l'exemple ci-dessus, uniqueId est utilisé pour l'identification de l'écran dans l'attribut "name", qui est overlay:1 pour un écran simulé. Pour un écran intégré, une valeur d'exemple peut être "local:45354385242535243453". Une autre option consiste à utiliser les informations sur le port matériel et à définir identifier="1" pour qu'il corresponde à DisplayWindowSettings#IDENTIFIER_PORT, puis à mettre à jour le nom pour utiliser le format "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>

Pour en savoir plus, consultez la section Identifiants d'affichage statiques.

Pour en savoir plus, voir :