Applications pour les appareils pliables et multi-écrans
En règle générale, les applications ne doivent pas s'appuyer sur des identifiants statiques ni sur une logique qui dépend de certains ID d'écran. Dans la plupart des cas, les applications doivent être redimensionnées et fonctionner sur différents écrans, et le système doit contrôler leur emplacement. 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 d'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 sur d'autres. En bref, le code spécifique à un appareil augmente la fragmentation.
Restreindre l'accès aux écrans
Si la configuration de l'appareil nécessite de restreindre 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 toute personne autre que 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 un SecurityException
.
Si le système est propriétaire de l'affichage, 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, cette activité peut lancer d'autres activités sur cet écran. Par conséquent, le propriétaire est responsable de la restriction de l'accès et de l'autorisation des applications de confiance uniquement.
De plus, davantage de restrictions sont ajoutées aux écrans virtuels, car n'importe quelle application peut en créer un sans le rendre visible par 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 en savoir plus, 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. Cette fonctionnalité est disponible dans system_server
.
Configurer les paramètres de fenêtrage de l'écran 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 d'applications, fond d'écran, barre de navigation et autres fenêtres de décoration) et l'IME s'affichent sur un écran.
Pour en savoir plus, consultez DisplayWindowSettings#shouldShowSystemDecorsLocked()
et DisplayWindowSettings#shouldShowImeLocked()
.
Pour identifier l'écran, utilisez un ID unique (la valeur par défaut est DisplayInfo#uniqueId
) ou 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 écran 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'échantillon 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 à modifier le nom pour qu'il utilise 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 Identifiants d'affichage statiques.
Pour en savoir plus, voir :