Les applications ciblant Android 12 (niveau d'API 31) ou une version ultérieure ne peuvent pas démarrer de services de premier plan
lorsqu'elles s'exécutent en arrière-plan, sauf dans quelques cas particuliers. Si une application tente de démarrer un
service de premier plan alors qu'elle s'exécute en arrière-plan et que le service de premier plan
ne fait pas partie des cas exceptionnels, le système génère une
ForegroundServiceStartNotAllowedException.
De plus, si une application souhaite lancer un service de premier plan qui nécessite des autorisations Pendant l'utilisation (par exemple, les autorisations d'accès aux capteurs corporels, à l'appareil photo, au micro ou à la position), elle ne peut pas créer le service lorsque l'application est en arrière-plan, même si elle fait partie des exceptions aux restrictions de démarrage en arrière-plan. La raison en est expliquée dans la section Restrictions concernant le démarrage des services de premier plan nécessitant des autorisations d'utilisation "Pendant l'utilisation".
Exceptions aux restrictions de démarrage en arrière-plan
Dans les situations suivantes, votre application peut démarrer des services de premier plan même lorsqu'elle s'exécute en arrière-plan :
- Votre application quitte un état visible par l'utilisateur, tel qu'une activité.
- Votre application peut démarrer une activité en arrière-plan, sauf si elle comporte une activité dans la pile "Retour" d'une tâche existante.
Votre application reçoit un message à priorité élevée à l'aide de Firebase Cloud Messaging.
L'utilisateur effectue une action sur un élément d'interface utilisateur lié à votre application. Par exemple, il peut interagir avec une bulle, notification, widget, ou une activité.
Votre application appelle une alarme exacte pour effectuer une action demandée par l'utilisateur.
Votre application est le mode de saisie actuel de l'appareil.
Votre application reçoit un événement lié au géorepérage ou à la transition de reconnaissance d'activité.
Une fois que l'appareil a redémarré et reçu l'action d'intent
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETEDouACTION_MY_PACKAGE_REPLACEDdans un broadcast receiver.Votre application reçoit l'action d'intent
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGED, ouACTION_LOCALE_CHANGEDdans un broadcast receiver.Votre application reçoit l'
ACTION_TRANSACTION_DETECTEDévénement deNfcService.Applications avec certains rôles ou autorisations système, tels que les propriétaires d'appareils et les propriétaires de profils.
Votre application utilise le Companion Device Manager et déclare l'autorisation
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDouREQUEST_COMPANION_RUN_IN_BACKGROUND. UtilisezREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDautant que possible.L'utilisateur désactive les optimisations de la batterie pour votre application.
Votre application dispose de l'
SYSTEM_ALERT_WINDOWautorisation. Remarque : Si votre application cible Android 15 ou version ultérieure, elle doit disposer de l'autorisationSYSTEM_ALERT_WINDOWet avoir actuellement une fenêtre de superposition visible.
Restrictions concernant le démarrage des services de premier plan nécessitant des autorisations d'utilisation "Pendant l'utilisation"
Sur Android 14 (niveau d'API 34) ou version ultérieure, il existe des situations particulières à prendre en compte si vous démarrez un service de premier plan qui nécessite des autorisations "Pendant l'utilisation".
Si votre application cible Android 14 ou version ultérieure, le système d'exploitation vérifie lorsque vous créez un service de premier plan que votre application dispose de toutes les autorisations appropriées pour ce type de service. Par exemple, lorsque vous créez un
service de premier plan de type
micro, le système
d'exploitation vérifie que votre application dispose actuellement de l'
RECORD_AUDIO
autorisation. Si vous ne disposez pas de cette autorisation, le système génère une
SecurityException.
Cela peut poser problème pour les autorisations "Pendant l'utilisation". Si votre application dispose d'une autorisation "Pendant l'utilisation", elle ne dispose de cette autorisation que lorsqu'elle est au premier plan. Cela signifie que si votre application est en arrière-plan et qu'elle tente de créer un service de premier plan de type appareil photo, position ou micro, le système constate que votre application ne dispose actuellement pas des autorisations requises et génère une erreur SecurityException.
De même, si votre application est en arrière-plan et qu'elle crée un service de santé qui nécessite l'autorisation BODY_SENSORS, l'application ne dispose pas actuellement de cette autorisation et le système génère une exception.
(Cela ne s'applique pas s'il s'agit d'un service de santé qui nécessite des autorisations différentes, comme ACTIVITY_RECOGNITION.) L'appel de PermissionChecker.checkSelfPermission() n'empêche pas ce problème. Si votre application dispose d'une autorisation "Pendant l'utilisation" et qu'elle appelle checkSelfPermission() pour vérifier si elle dispose de cette autorisation, la méthode renvoie PERMISSION_GRANTED même si l'application est en arrière-plan. Lorsque la méthode renvoie PERMISSION_GRANTED, cela signifie que votre application dispose de cette autorisation lorsqu'elle est en cours d'utilisation.
Pour cette raison, si votre service de premier plan a besoin d'une autorisation "Pendant l'utilisation", vous devez appeler Context.startForegroundService() ou Context.bindService() lorsque votre application a une activité visible, sauf si le service relève de l'une des exemptions définies.
Exceptions aux restrictions concernant les autorisations "Pendant l'utilisation"
Dans certains cas, même si un service de premier plan est démarré alors que l'application s'exécute en arrière-plan, il peut toujours accéder aux informations de localisation, de l'appareil photo et du micro lorsque l'application s'exécute au premier plan ("Pendant l'utilisation").
Dans ces mêmes situations, si le service déclare un service de premier plan
type de location et qu'il est démarré par une application qui
dispose de l'autorisation ACCESS_BACKGROUND_LOCATION, ce service peut accéder aux informations de localisation à tout moment, même lorsque
l'application s'exécute en arrière-plan.
La liste suivante contient ces situations :
- Un composant système démarre le service.
- Le service démarre en interagissant avec des widgets d'application.
- Le service démarre en interagissant avec une notification.
- Le service démarre en tant que
PendingIntentenvoyé depuis une autre application visible. - Le service est démarré par une application d'outil de contrôle des règles relatives aux appareils qui s'exécute en mode propriétaire de l'appareil.
- Le service est démarré par une application qui fournit le
VoiceInteractionService. - Le service est démarré par une application disposant de l'autorisation privilégiée
START_ACTIVITIES_FROM_BACKGROUND.
Déterminer les services concernés dans votre application
Lorsque vous testez votre application, démarrez ses services de premier plan. Si un service démarré a un accès limité à la position, au micro et à l'appareil photo, le message suivant s'affiche dans Logcat :
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME