Pour aider les développeurs à définir des services de premier plan destinés aux utilisateurs, Android 10 a introduit l'attribut android:foregroundServiceType
dans l'élément <service>
.
Si votre application cible Android 14, elle doit spécifier les types de services de premier plan appropriés. Comme dans les versions précédentes d'Android, vous pouvez combiner plusieurs types. Cette liste présente les types de services de premier plan disponibles :
camera
connectedDevice
dataSync
health
location
mediaPlayback
mediaProjection
microphone
phoneCall
remoteMessaging
shortService
specialUse
systemExempted
Si un cas d'utilisation dans votre application n'est associé à aucun de ces types, nous vous recommandons fortement de migrer votre logique pour utiliser WorkManager ou les tâches de transfert de données lancé par l'utilisateur.
Les types health, remoteMessaging, shortService, specialUse
et systemExempted
sont nouveaux sur Android 14.
L'extrait de code suivant fournit un exemple de déclaration de type de service de premier plan dans le fichier manifeste :
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
Si une application qui cible Android 14 ne définit pas de types pour un service donné dans le fichier manifeste, le système génère MissingForegroundServiceTypeException
lors de l'appel de startForeground()
pour ce service.
Déclarer une nouvelle autorisation pour utiliser les types de services de premier plan
If apps that target Android 14 use a foreground service, they must declare a specific permission, based on the foreground service type, that Android 14 introduces. These permissions appear in the sections labeled "permission that you must declare in your manifest file" in the intended use cases and enforcement for each foreground service type section on this page.
All of the permissions are defined as normal permissions and are granted by default. Users cannot revoke these permissions.
Inclure le type de service de premier plan lors de l'exécution
Une bonne pratique pour les applications qui lancent des services de premier plan consiste à utiliser la version ServiceCompat
de startForeground()
(disponible dans androidx-core 1.12 et versions ultérieures), dans laquelle vous transmettez un entier bit à bit de types de service de premier plan. Vous pouvez choisir de transmettre une ou plusieurs valeurs de type.
En règle générale, vous ne devez déclarer que les types requis pour un cas d'utilisation particulier. Cela permet de répondre plus facilement aux attentes du système pour chaque type de service de premier plan. Si un service de premier plan est démarré avec plusieurs types, il doit respecter les exigences d'application des plates-formes de tous les types.
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
Si le type de service de premier plan n'est pas spécifié dans l'appel, il utilise par défaut les valeurs définies dans le fichier manifeste. Si vous n'avez pas spécifié le type de service dans le fichier manifeste, le système génère MissingForegroundServiceTypeException
.
Si le service de premier plan a besoin de nouvelles autorisations après son lancement, vous devez appeler à nouveau startForeground()
et ajouter les nouveaux types de services. Par exemple, supposons qu'une application de fitness exécute un service de suivi de la course à pied qui a toujours besoin des informations location
, mais qui peut ou non avoir besoin d'autorisations media
. Vous devez déclarer à la fois location
et mediaPlayback
dans le fichier manifeste. Si un utilisateur démarre une exécution et souhaite simplement suivre sa position, votre application doit appeler startForeground()
et ne transmettre que le type de service location
. Ensuite, si l'utilisateur souhaite commencer à lire un contenu audio, appelez à nouveau startForeground()
et transmettez location|mediaPlayback
.
Vérifications de l'exécution du système
The system checks for proper use of foreground service types and confirms that
the app has requested the proper runtime permissions or uses the required APIs.
For instance, the system expects apps that use the foreground service type
FOREGROUND_SERVICE_TYPE_LOCATION
type to request either
ACCESS_COARSE_LOCATION
or ACCESS_FINE_LOCATION
.
This implies that apps must follow a very specific
order of operations when requesting permissions from the user and starting
foreground services. Permissions must be requested and granted before the
app attempts to call startForeground()
. Apps that request the appropriate
permissions after the foreground service has been started must change this order
of operations and request the permission before starting the foreground service.
The specifics of platform enforcement appear in the sections labeled "runtime requirements" in the intended use cases and enforcement for each foreground service type section on this page.
Cas d'utilisation prévus et application forcée pour chaque type de service de premier plan
Pour utiliser un type de service de premier plan donné, vous devez déclarer une autorisation particulière dans votre fichier manifeste, respecter des exigences d'exécution spécifiques et votre application doit respecter l'un des ensembles de cas d'utilisation prévus pour ce type. Les sections suivantes décrivent les autorisations que vous devez déclarer, les conditions préalables d'exécution et les cas d'utilisation prévus pour chaque type.
Appareil photo
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
camera
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_CAMERA
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
- Conditions préalables d'exécution
Demander l'autorisation d'exécution
CAMERA
et l'obtenirRemarque:L'autorisation d'exécution
CAMERA
est soumise à des restrictions d'utilisation. Pour cette raison, vous ne pouvez pas créer de service de premier plancamera
lorsque votre application est en arrière-plan, à quelques exceptions près. Pour en savoir plus, consultez la section Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation.- Description
Continuez à avoir accès à la caméra en arrière-plan, pour les applications de chat vidéo permettant d'effectuer plusieurs tâches en même temps, par exemple.
Appareil connecté
- Foreground service type to declare in manifest under
android:foregroundServiceType
connectedDevice
- Permission to declare in your manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE
- Constant to pass to
startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
- Runtime prerequisites
At least one of the following conditions must be true:
Declare at least one of the following permissions in your manifest:
Request and be granted at least one of the following runtime permissions:
- Description
Interactions with external devices that require a Bluetooth, NFC, IR, USB, or network connection.
- Alternatives
If your app needs to do continuous data transfer to an external device, consider using the companion device manager instead. Use the companion device presence API to help your app stay running while the companion device is in range.
If your app needs to scan for bluetooth devices, consider using the Bluetooth scan API instead.
Synchroniser les données
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
dataSync
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_DATA_SYNC
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
- Conditions préalables d'exécution
- Aucune
- Description
Opérations de transfert de données, telles que :
- Importation ou téléchargement de données
- Opérations de sauvegarde et restauration
- Opérations d'importation ou d'exportation
- Extraction de données
- Traitement des fichiers en local
- Transfert de données d'un appareil vers le cloud via un réseau
- Autres solutions
Pour en savoir plus, consultez la section Alternatives aux services de premier plan de synchronisation des données.
Santé
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
health
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_HEALTH
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
- Conditions préalables d'exécution
Vous devez remplir l'une des conditions suivantes :
Déclarez l'autorisation
HIGH_SAMPLING_RATE_SENSORS
dans votre fichier manifeste.Demandez et obtenez au moins l'une des autorisations d'exécution suivantes:
BODY_SENSORS
au niveau d'API 35 et inférieurREAD_HEART_RATE
READ_SKIN_TEMPERATURE
READ_OXYGEN_SATURATION
ACTIVITY_RECOGNITION
Remarque:Les autorisations d'exécution READ basées sur les capteurs et
BODY_SENSORS
sont soumises à des restrictions d'utilisation. Pour cette raison, vous ne pouvez pas créer de service de premier planhealth
qui utilise des capteurs corporels lorsque votre application est en arrière-plan, sauf si vous avez reçu les autorisationsBODY_SENSORS_BACKGROUND
(niveau d'API 33 à 35) ouREAD_HEALTH_DATA_IN_BACKGROUND
(niveau d'API 36 et versions ultérieures). Pour en savoir plus, consultez la section Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation.- Description
Tous les cas d'utilisation de longue durée pour prendre en charge les applications de la catégorie "Remise en forme", tels que les coachs électroniques d'entraînement.
Localisation
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
location
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_LOCATION
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
- Conditions préalables d'exécution
L'utilisateur doit avoir activé les services de localisation, et l'application doit disposer d'au moins l'une des autorisations d'exécution suivantes:
Remarque:Pour vérifier que l'utilisateur a activé les services de localisation et accordé l'accès aux autorisations d'exécution, utilisez
PermissionChecker#checkSelfPermission()
.Remarque:Les autorisations d'exécution d'accéder à la position sont soumises à des restrictions d'utilisation. Pour cette raison, vous ne pouvez pas créer de service de premier plan
location
lorsque votre application est en arrière-plan, sauf si vous avez reçu l'autorisation d'exécutionACCESS_BACKGROUND_LOCATION
. Pour en savoir plus, consultez la section Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation.- Description
Cas d'utilisation de longue durée nécessitant un accès à la position, tels que la navigation et le partage de position.
- Autres solutions
Si votre application doit être déclenchée lorsque l'utilisateur atteint des emplacements spécifiques, envisagez plutôt d'utiliser l'API Geofence.
Contenus multimédias
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
mediaPlayback
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_MEDIA_PLAYBACK
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
- Conditions préalables d'exécution
- Aucune
- Description
- Continuez la lecture audio ou vidéo en arrière-plan. Prend en charge la fonctionnalité d'enregistrement vidéo numérique (DVR) sur Android TV.
- Autres solutions
- Si vous diffusez une vidéo en mode Picture-in-picture, utilisez le mode Picture-in-picture.
Projection multimédia
- Foreground service type to declare in manifest under
android:foregroundServiceType
mediaProjection
- Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION
- Constant to pass to
startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
- Runtime prerequisites
Call the
createScreenCaptureIntent()
method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.After you have created the foreground service, you can call
MediaProjectionManager.getMediaProjection()
.- Description
Project content to non-primary display or external device using the
MediaProjection
APIs. This content doesn't have to be exclusively media content.- Alternatives
To stream media to another device, use the Google Cast SDK.
Micro
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
microphone
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_MICROPHONE
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
- Conditions préalables d'exécution
Demandez l'autorisation d'exécution
RECORD_AUDIO
et obtenez-la.Remarque:L'autorisation d'exécution
RECORD_AUDIO
est soumise à des restrictions d'utilisation. Pour cette raison, vous ne pouvez pas créer de service de premier planmicrophone
lorsque votre application est en arrière-plan, à quelques exceptions près. Pour en savoir plus, consultez la section Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation.- Description
Continuez à utiliser le micro en arrière-plan, par exemple pour un enregistreur vocal ou une application de communication.
Appel téléphonique
- Foreground service type to declare in manifest under
android:foregroundServiceType
phoneCall
- Permission to declare in your manifest
FOREGROUND_SERVICE_PHONE_CALL
- Constant to pass to
startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
- Runtime prerequisites
At least one of these conditions must be true:
- App has declared the
MANAGE_OWN_CALLS
permission in its manifest file.
- App has declared the
- App is the default dialer app through the
ROLE_DIALER
role.
- App is the default dialer app through the
- Description
Continue an ongoing call using the
ConnectionService
APIs.- Alternatives
If you need to make phone, video, or VoIP calls, consider using the
android.telecom
library.Consider using
CallScreeningService
to screen calls.
Messagerie à distance
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
remoteMessaging
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_REMOTE_MESSAGING
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
- Conditions préalables d'exécution
- Aucune
- Description
- Transférez des messages d'un appareil à un autre. Contribue à la continuité des tâches de messagerie d'un utilisateur lorsqu'il change d'appareil.
Service court
- Foreground service type to declare in manifest under
android:foregroundServiceType
shortService
- Permission to declare in your manifest
- None
- Constant to pass to
startForeground()
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
- Runtime prerequisites
- None
- Description
Quickly finish critical work that cannot be interrupted or postponed.
This type has some unique characteristics:
- Can only run for a short period of time (about 3 minutes).
- No support for sticky foreground services.
- Cannot start other foreground services.
- Doesn't require a type-specific permission, though it still
requires the
FOREGROUND_SERVICE
permission. - A
shortService
can only change to another service type if the app is currently eligible to start a new foreground service. - A foreground service can change its type to
shortService
at any time, at which point the timeout period begins.
The timeout for shortService begins from the moment that
Service.startForeground()
is called. The app is expected to callService.stopSelf()
orService.stopForeground()
before the timeout occurs. Otherwise, the newService.onTimeout()
is called, giving apps a brief opportunity to callstopSelf()
orstopForeground()
to stop their service.A short time after
Service.onTimeout()
is called, the app enters a cached state and is no longer considered to be in the foreground, unless the user is actively interacting with the app. A short time after the app is cached and the service has not stopped, the app receives an ANR. The ANR message mentionsFOREGROUND_SERVICE_TYPE_SHORT_SERVICE
. For these reasons, it's considered best practice to implement theService.onTimeout()
callback.The
Service.onTimeout()
callback doesn't exist on Android 13 and lower. If the same service runs on such devices, it doesn't receive a timeout, nor does it ANR. Make sure that your service stops as soon as it finishes the processing task, even if it hasn't received theService.onTimeout()
callback yet.It's important to note that if the timeout of the
shortService
is not respected, the app will ANR even if it has other valid foreground services or other app lifecycle processes running.If an app is visible to the user or satisfies one of the exemptions that allow foreground services to be started from the background, calling
Service.StartForeground()
again with theFOREGROUND_SERVICE_TYPE_SHORT_SERVICE
parameter extends the timeout by another 3 minutes. If the app isn't visible to the user and doesn't satisfy one of the exemptions, any attempt to start another foreground service, regardless of type, causes aForegroundServiceStartNotAllowedException
.If a user disables battery optimization for your app, it's still affected by the timeout of shortService FGS.
If you start a foreground service that includes the
shortService
type and another foreground service type, the system ignores theshortService
type declaration. However, the service must still adhere to the prerequisites of the other declared types. For more information, see the Foreground services documentation.
Utilisation spéciale
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
specialUse
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_SPECIAL_USE
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
- Conditions préalables d'exécution
- Aucune
- Description
Recouvre les cas d'utilisation de services de premier plan valides qui ne sont pas couverts par les autres types de services de premier plan.
En plus de déclarer le type de service de premier plan
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
, les développeurs doivent déclarer les cas d'utilisation dans le fichier manifeste. Pour ce faire, ils doivent spécifier l'élément<property>
dans l'élément<service>
. Ces valeurs et les cas d'utilisation correspondants sont examinés lorsque vous envoyez votre application dans la Google Play Console. Les cas d'utilisation que vous fournissez sont libres et vous devez vous assurer de fournir suffisamment d'informations pour permettre à l'examinateur de voir pourquoi vous devez utiliser le typespecialUse
.<service android:name="fooService" android:foregroundServiceType="specialUse"> <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="explanation_for_special_use"/> </service>
Système exempté
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceType
systemExempted
- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
- Constante à transmettre à
startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
- Conditions préalables d'exécution
- Aucune
- Description
Réservé pour les applications système et les intégrations système spécifiques, afin de continuer à utiliser les services de premier plan.
Pour utiliser ce type, une application doit correspondre à au moins un des critères suivants :
- L'appareil est en mode démo
- L'application est un Device Owner
- L'application est un Profiler Owner
- Les applications de sécurité ayant le rôle
ROLE_EMERGENCY
- Les applications Device Admin
- Applications disposant de l'autorisation
SCHEDULE_EXACT_ALARM
ouUSE_EXACT_ALARM
et qui utilisent le service de premier plan pour continuer les alarmes en arrière-plan, y compris les alarmes haptiques uniquement. Applications VPN (configurées via Paramètres > Réseau et Internet > VPN)
Autrement, le fait de déclarer ce type renvoie une exception
ForegroundServiceTypeNotAllowedException
.
Application des règles Google Play pour l'utilisation des types de services de premier plan
Si votre application cible Android 14 ou une version ultérieure, vous devez déclarer les types de services de premier plan de votre application sur la page "Contenu de l'application" de la Play Console (Règles > Contenu de l'application). Pour en savoir plus sur la déclaration de vos types de services de premier plan dans la Play Console, consultez Comprendre les exigences liées aux services de premier plan et à l'intent plein écran.