Les applications qui ciblent Android 12 (niveau d'API 31) ou une version ultérieure ne peuvent pas démarrer de services de premier plan lorsque l'application s'exécute en arrière-plan, sauf dans quelques cas particuliers. Si une application tente de démarrer un service de premier plan pendant l'exécution en arrière-plan et que le service de premier plan ne répond pas à l'un 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 en cours d'utilisation (par exemple, des autorisations pour les capteurs corporels, l'appareil photo, le 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 sur le démarrage de services de premier plan nécessitant des autorisations en cours d'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 passe d'un état visible par l'utilisateur, comme une activité.
- Votre application peut démarrer une activité en arrière-plan, sauf si elle contient 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, une notification, un widget ou une activité.
Votre application appelle une alarme exacte pour effectuer une action demandée par l'utilisateur.
Votre application est la méthode d'entrée actuelle de l'appareil.
Votre application reçoit un événement lié au géorepérage ou à la transition de reconnaissance d'activité.
Une fois l'appareil redémarré et qu'il a reçu l'action d'intent
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
ouACTION_MY_PACKAGE_REPLACED
dans un broadcast receiver.Votre application reçoit l'action d'intent
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
ouACTION_LOCALE_CHANGED
dans un broadcast receiver.Votre application reçoit l'événement
ACTION_TRANSACTION_DETECTED
deNfcService
.Applications disposant de certains rôles ou autorisations système, tels que les propriétaires d'appareils et les propriétaires de profils.
Votre application utilise le gestionnaire d'appareils associés et déclare l'autorisation
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
ouREQUEST_COMPANION_RUN_IN_BACKGROUND
. Dans la mesure du possible, utilisezREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.L'utilisateur désactive l'optimisation de la batterie pour votre application.
Votre application dispose de l'autorisation
SYSTEM_ALERT_WINDOW
. Remarque: Si votre application cible Android 15 ou version ultérieure, elle doit disposer de l'autorisationSYSTEM_ALERT_WINDOW
et elle doit actuellement avoir une fenêtre superposée visible.
Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation
Sur Android 14 (niveau d'API 34) ou version ultérieure, vous devez tenir compte de situations spéciales si vous démarrez un service de premier plan qui nécessite des autorisations en cours d'utilisation.
Si votre application cible Android 14 ou une 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 microphone, le système d'exploitation vérifie que votre application dispose actuellement de l'autorisation RECORD_AUDIO
. Si vous ne disposez pas de cette autorisation, le système génère une exception SecurityException
.
Pour les autorisations d'utilisation, cela peut poser problème. Si votre application dispose d'une autorisation "si l'application est ouverte", elle ne dispose de cette autorisation que lorsque l'application 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 voit que votre application ne dispose pas actuellement des autorisations requises et génère une erreur SecurityException
.
De même, si votre application s'exécute en arrière-plan et qu'elle crée un service de santé qui nécessite l'autorisation BODY_SENSORS
, elle 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é nécessitant 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 lorsque l'application est en cours d'utilisation.
Par conséquent, si votre service de premier plan a besoin d'une autorisation "si l'application est ouverte", vous devez appeler Context.startForegroundService()
ou Context.bindService()
lorsque votre application a une activité visible, sauf si le service fait partie de l'une des exceptions définies.
Exceptions aux restrictions concernant les autorisations en cours d'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 ("while-in-use").
Dans ces mêmes situations, si le service déclare un type de service de premier plan de location
et est démarré par une application disposant de l'autorisation ACCESS_BACKGROUND_LOCATION
, ce service peut accéder aux informations de localisation en permanence, 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 commence par interagir avec les widgets d'application.
- Le service commence par interagir avec une notification.
- Le service commence comme un
PendingIntent
envoyé à partir d'une autre application visible. - Le service est lancé par une application qui est un 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 lancé a un accès limité à la position, au micro et à la caméra, le message suivant s'affiche dans Logcat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME