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 sur une logique qui dépend de certains ID 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 ou effectuer une 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 d'accès à un ou plusieurs affichages, il est recommandé d'utiliser l'indicateur Display#FLAG_PRIVATE pour désigner ces affichages comme private . Cela empêche tous 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 est propriétaire de l'affichage, le système 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 de confiance .

De plus, plus de restrictions sont ajoutées aux affichages virtuels car n'importe quelle application peut en créer un sans le rendre visible pour 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, consultez :

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

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

Configuration des paramètres de fenêtrage d'affichage et des décorations 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 système (lanceur, fond d'écran, barre de navigation et autres fenêtres de décor) et l'IME apparaissent sur un écran. Pour plus de détails, voir DisplayWindowSettings#shouldShowSystemDecorsLocked() et DisplayWindowSettings#shouldShowImeLocked() .

Pour identifier l'affichage, utilisez soit un ID unique (par défaut, DisplayInfo#uniqueId ) soit un ID de port physique pour les affichages 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 de 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, voir Identificateurs d'affichage statiques .

Pour plus d'informations, consultez :