Android 10 (niveau d'API 29) ou version ultérieure impose des restrictions concernant le moment où les applications peuvent démarrer des activités lorsqu'elles s'exécutent en arrière-plan. Ces restrictions permettent de limiter les interruptions pour l'utilisateur et lui permettent de mieux contrôler ce qui s'affiche à l'écran.
Ce guide présente des notifications comme alternative pour démarrer des activités en arrière-plan. Elle liste également les cas spécifiques où la restriction ne s'applique pas.
Afficher les notifications à la place
Dans presque tous les cas, les applications en arrière-plan doivent afficher des notifications urgentes pour fournir des informations urgentes à l'utilisateur au lieu de démarrer directement une activité. Ces notifications incluent la gestion d'un appel téléphonique entrant ou d'une horloge active.
Ce système d'alertes et de rappels basé sur des notifications offre plusieurs avantages aux utilisateurs:
- Lorsque l'utilisateur se sert de l'appareil, une notification prioritaire lui permet de répondre. L'utilisateur conserve son contexte actuel et contrôle le contenu qu'il voit à l'écran.
- Les notifications urgentes respectent les règles Ne pas déranger de l'utilisateur. Par exemple, les utilisateurs peuvent n'autoriser les appels que de contacts spécifiques ou de appelants fréquents lorsque le mode Ne pas déranger est activé.
- Lorsque l'écran de l'appareil est éteint, l'intent plein écran se lance immédiatement.
- Sur l'écran Settings (Paramètres) de l'appareil, l'utilisateur peut voir quelles applications ont récemment envoyé des notifications, y compris à partir de canaux de notification spécifiques. À partir de cet écran, l'utilisateur peut contrôler ses préférences de notification.
À quel moment les applications peuvent-elles démarrer des activités ?
Les applications fonctionnant sous Android 10 ou version ultérieure peuvent démarrer des activités lorsqu'une ou plusieurs des conditions suivantes sont remplies:
- L'application dispose d'une fenêtre visible, telle qu'une activité au premier plan.
- L'application comporte une activité dans la pile "Retour" de la tâche de premier plan.
L'application comporte une activité dans la pile "Retour" d'une tâche existante sur l'écran "Recents" (Éléments récents).
L'application présente une activité qui a commencé très récemment.
L'application a appelé
finish()
sur une activité très récemment. Cela ne s'applique que lorsque l'application avait une activité au premier plan ou une activité dans la pile "Retour" de la tâche de premier plan au moment de l'appel definish()
.L'appli dispose de l'un des services suivants, qui est lié au système. Ces services peuvent avoir besoin de lancer une UI.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(Non applicable sur Android 14 (niveau d'API 34) ou version ultérieure)VoiceInteractionService
VrListenerService
.
L'application dispose d'un service lié à une autre application visible. L'application liée au service doit rester visible pour que l'application puisse démarrer les activités en arrière-plan.
L'application reçoit une notification
PendingIntent
du système. Dans le cas d'intents en attente pour des services et des broadcast receivers, l'application peut démarrer des activités pendant quelques secondes après l'envoi de l'intent en attente.L'application reçoit un
PendingIntent
envoyé depuis une autre application visible.L'application reçoit une diffusion du système où elle doit lancer une UI. Exemples :
ACTION_NEW_OUTGOING_CALL
etSECRET_CODE_ACTION
. L'application peut démarrer des activités pendant quelques secondes après l'envoi de la diffusion.L'application est associée à un appareil matériel associé via l'API
CompanionDeviceManager
. Cette API permet à l'application de démarrer des activités en réponse aux actions effectuées par l'utilisateur sur un appareil associé.L'application est un outil de contrôle des règles relatives aux appareils qui s'exécute en mode propriétaire de l'appareil. Exemples de cas d'utilisation : appareils d'entreprise entièrement gérés, ainsi que appareils dédiés tels que la signalétique numérique et les kiosques.
L'utilisateur accorde l'autorisation
SYSTEM_ALERT_WINDOW
à l'application.
Activation requise lors du démarrage d'activités à partir de PendingIntents
Pour éviter d'autoriser le démarrage accidentel d'activité en fonction des conditions listées, à partir d'Android 14, des API explicites vous permettent d'activer ou de désactiver l'octroi d'autorisations d'application pour le démarrage d'activité.
Par défaut, les applications ciblant Android 15 ou version ultérieure n'accorderont plus implicitement de droits de lancement d'activité en arrière-plan aux PendingIntents
qu'elles créent.
Une activation explicite est requise. Pour ce faire, ces options sont disponibles selon que l'application envoie ou crée des PendingIntents
.
Par l'expéditeur du PendingIntent
Les applications ciblant Android 14 ou version ultérieure qui souhaitent lancer un PendingIntent
doivent
- remplir les conditions indiquées et
- autoriser le lancement de l'activité en arrière-plan en fonction de ces exceptions
Cette activation ne doit se produire que si le développeur de l'application sait que celle-ci va lancer une activité.
Pour l'activer, l'application doit transmettre un bundle ActivityOptions
avec setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
à PendingIntent.send()
ou à des méthodes similaires.
Par le créateur du PendingIntent
Les applications ciblant Android 15 ou version ultérieure qui créent un PendingIntent
doivent désormais l'activer explicitement pour autoriser le lancement de l'activité en arrière-plan si elles souhaitent que ces PendingIntents
puissent être démarrés dans les conditions listées.
Dans la plupart des cas, l'application doit être l'application qui lance PendingIntent
.
Toutefois, si l'application qui l'a créée doit accorder ces droits:
PendingIntent
peut être démarré à chaque fois que l'application en cours de création est visible.- Le
PendingIntent
peut être démarré à tout moment si l'application qui l'a créée dispose de privilèges spéciaux.
Pour l'activer, l'application doit transmettre un bundle ActivityOptions
avec setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
à PendingIntent.getActivity()
ou à des méthodes similaires.
Pour en savoir plus, consultez la documentation de référence correspondante:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode