Restrictions concernant le démarrage d'activités en arrière-plan

Android 10 (niveau d'API 29) ou version ultérieure limite le moment où les applications peuvent démarrer des activités lorsqu'elles s'exécutent en arrière-plan. Ces restrictions permettent de réduire les interruptions pour l'utilisateur et de lui donner plus de contrôle sur ce qui s'affiche à l'écran.

Ce guide présente les notifications comme une alternative au démarrage d'activités en arrière-plan. Il indique également les cas spécifiques où la restriction ne s'applique pas.

Afficher les notifications à la place

Dans la plupart des 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 alarme active.

Ce système d'alerte et de rappel basé sur les notifications présente plusieurs avantages pour les utilisateurs:

  • Lorsqu'il utilise l'appareil, l'utilisateur voit une notification d'alerte qui 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 de Ne pas déranger de l'utilisateur. Par exemple, les utilisateurs peuvent n'autoriser les appels que de la part de contacts spécifiques ou d'appelants répétés 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. Sur cet écran, l'utilisateur peut contrôler ses préférences de notification.

Quand les applications peuvent-elles démarrer des activités ?

Les applications exécutées sur 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, comme une activité au premier plan.
  • L'application comporte une activité dans la pile "Retour" de la tâche de premier plan.
  • L'application présente une activité dans la pile "Retour" d'une tâche existante sur l'écran "Recents" (Éléments récents).

  • L'application a 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 arrière de la tâche de premier plan au moment de l'appel de finish().

  • L'application dispose de l'un des services suivants, qui est lié par le système. Ces services peuvent avoir besoin de lancer une UI.

  • L'application dispose d'un service lié par une autre application visible. L'application liée au service doit rester visible pour que l'application en arrière-plan puisse démarrer les activités.

  • L'application reçoit une notification PendingIntent du système. Dans le cas d'intents en attente pour les services et les 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 système dans laquelle elle doit lancer une UI. Par exemple, il peut s'agir de ACTION_NEW_OUTGOING_CALL et SECRET_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 lancer des activités en réponse aux actions que l'utilisateur effectue sur un appareil associé.

  • L'application est un outil de contrôle des règles relatives aux appareils exécuté en mode propriétaire de l'appareil. Parmi les exemples de cas d'utilisation, citons les appareils d'entreprise entièrement gérés, ainsi que les appareils dédiés tels que les kiosques et les supports de signalétique numérique.

  • L'utilisateur accorde à l'application l'autorisation SYSTEM_ALERT_WINDOW.

Activation requise lors du démarrage d'activités à partir de PendingIntents

Pour éviter d'autoriser des démarrages d'activités accidentels en fonction des conditions indiquées, à partir d'Android 14, des API explicites vous permettent d'activer ou de désactiver l'autorisation d'une application pour les démarrages d'activités.

Les applications ciblant Android 15 ou version ultérieure ne seront plus configurées par défaut pour accorder implicitement des droits de lancement d'activité en arrière-plan (BAL) aux PendingIntents qu'elles créent. L'acceptation explicite est requise. Pour ce faire, voici les options disponibles selon que l'application envoie ou crée des PendingIntents.

Tableau des intents en attente
Figure 1: Flux de décision pour le lancement d'activités en arrière-plan.

Par l'expéditeur du PendingIntent

Les applications ciblant Android 14 ou version ultérieure qui souhaitent démarrer une PendingIntent doivent :

  • remplir les conditions indiquées et
  • activer le lancement d'activités en arrière-plan en fonction de ces exceptions ;

Cette activation ne doit que se produire si le développeur de l'application sait qu'elle va démarrer une activité.

Pour l'activer, l'application doit transmettre un bundle ActivityOptions avec setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) aux méthodes PendingIntent.send() ou similaires.

Par le créateur du PendingIntent

Les applications qui ciblent Android 15 ou version ultérieure et qui créent un PendingIntent doivent désormais explicitement activer le lancement d'activité en arrière-plan si elles souhaitent que ces PendingIntents puissent être démarrés dans les conditions indiquées.

Dans la plupart des cas, l'application qui lance PendingIntent doit être celle qui l'active. Toutefois, si l'application de création doit accorder ces droits:

  • PendingIntent peut être démarré à tout moment lorsque l'application de création est visible.
  • PendingIntent peut être démarré à tout moment si l'application de création dispose de privilèges spéciaux.

Pour l'activer, l'application doit transmettre un bundle ActivityOptions avec setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) aux méthodes PendingIntent.getActivity() ou similaires.

Pour en savoir plus, consultez la documentation de référence correspondante: