Pratiques recommandées

Applications pour appareils pliables et multi-écrans

En règle générale, les applications ne doivent pas s'appuyer sur des identifiants statiques ou une logique qui dépend de certains identifiants d'affichage. Dans la plupart des cas, les applications doivent être redimensionnées et fonctionner sur différents écrans et le système doit contrôler où localiser les 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'affichage 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 présumez pas que ce qui fonctionne sur un appareil fonctionnera sur d’autres appareils. En bref, le code spécifique à l’appareil augmente la fragmentation.

Restreindre l'accès aux écrans

Si la configuration de l'appareil nécessite la restriction de l'accès à un ou plusieurs écrans, il est recommandé d'utiliser l'indicateur Display#FLAG_PRIVATE pour désigner ces écrans comme privés . Cela empêche tout le monde, sauf le propriétaire, d'ajouter du contenu à l'affichage. 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 possède l'écran, il peut ajouter des fenêtres et lancer des activités.

De plus, les entités placées sur un affichage peuvent toujours accéder à cet affichage. Si le propriétaire lance une activité sur un écran, alors l'activité peut lancer d'autres activités sur cet écran. Par conséquent, le propriétaire est responsable de restreindre l’accès et d’autoriser uniquement les applications approuvées.

De plus, davantage de restrictions sont ajoutées aux affichages virtuels, car n'importe quelle application peut en créer un sans le rendre visible à l'utilisateur. Si l'affichage 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 plus d'informations, voir :

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

Pour contrôler conditionnellement les lancements 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. Ceci est disponible dans system_server .

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

Les décorations système peuvent être configurées par affichage dans DisplayWindowSettings . Une implémentation de périphérique peut fournir une configuration par défaut dans /data/system/display_settings.xml .

Cette valeur détermine si les décorations du système (lanceur, fond d'écran, barre de navigation et autres fenêtres de décoration) et l'IME apparaissent sur un écran. Pour plus de détails, consultez DisplayWindowSettings#shouldShowSystemDecorsLocked() et DisplayWindowSettings#shouldShowImeLocked() .

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

Par exemple, 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'affichage dans l'attribut name, qui pour un affichage simulé est overlay:1 . Pour un affichage intégré, un exemple de valeur peut être "local:45354385242535243453" . Une autre option consiste à utiliser les informations du port matériel et à définir identifier="1" pour correspondre à 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 plus de détails, consultez Identifiants d'affichage statique .

Pour plus d'informations, voir :