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 :
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
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
Si les applications qui ciblent Android 14 utilisent un service de premier plan, elles doivent déclarer une autorisation spécifique, basée sur le type de service de premier plan, introduite par Android 14. Ces autorisations apparaissent dans les sections intitulées "Autorisation que vous devez déclarer dans votre fichier manifeste" de la section Cas d'utilisation prévus et mesures d'application pour chaque type de service de premier plan sur cette page.
Toutes les autorisations sont définies comme des autorisations normales et sont accordées par défaut. Les utilisateurs ne peuvent pas les révoquer.
Inclure le type de service de premier plan lors de l'exécution
The best practice for applications starting foreground services is to use the
ServiceCompat version of startForeground() (available in androidx-core
1.12 and higher) where you pass in a bitwise
integer of foreground service types. You can choose to pass one or more type
values.
Usually, you should declare only the types required for a particular use case. This makes it easier to meet the system's expectations for each foreground service type. In cases where a foreground service is started with multiple types, then the foreground service must adhere to the platform enforcement requirements of all types.
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
If the foreground service type is not specified in the call, the type defaults
to the values defined in the manifest. If you didn't specify the service
type in the manifest, the system throws
MissingForegroundServiceTypeException.
If the foreground service needs new permissions after you launch it, you
should call startForeground() again and add the new service types. For
example, suppose a fitness app runs a running-tracker service that always needs
location information, but might or might not need media permissions. You
would need to declare both location and mediaPlayback in the manifest. If a
user starts a run and just wants their location tracked, your app should call
startForeground() and pass just the location service type. Then, if the user
wants to start playing audio, call startForeground() again and pass
location|mediaPlayback.
Vérifications de l'exécution du système
Le système vérifie que les types de services de premier plan sont utilisés correctement et confirme que l'application a demandé les autorisations d'exécution appropriées ou qu'elle utilise les API requises.
Par exemple, le système s'attend à ce que les applications qui utilisent le type de service FOREGROUND_SERVICE_TYPE_LOCATION de premier plan demandent ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION.
Par conséquent, les applications doivent suivre un ordre d'opérations très spécifique lorsqu'elles demandent des autorisations à l'utilisateur et démarrent des services de premier plan. Les autorisations doivent être demandées et accordées avant que l'application ne tente d'appeler startForeground(). Les applications qui demandent les autorisations appropriées après le démarrage du service de premier plan doivent modifier cet ordre des opérations et demander l'autorisation avant de démarrer le service de premier plan.
Les spécificités des mesures d'application de la plate-forme apparaissent dans les sections intitulées "Conditions d'exécution" de la section Cas d'utilisation prévus et mesures d'application pour chaque type de service de premier plan sur cette 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.
Caméra
- Foreground service type to declare in manifest under
android:foregroundServiceType camera- Permission to declare in your manifest
FOREGROUND_SERVICE_CAMERA- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_CAMERA- Runtime prerequisites
Request and be granted the
CAMERAruntime permissionNote: The
CAMERAruntime permission is subject to while-in-use restrictions. For this reason, you cannot create acameraforeground service while your app is in the background, with a few exceptions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Continue to access the camera from the background, such as video chat apps that allow for multitasking.
Appareil connecté
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypeconnectedDevice- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_CONNECTED_DEVICE- Constante à transmettre à
startForeground() FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- Conditions préalables d'exécution
Vous devez remplir l'une des conditions suivantes :
Déclarez au moins l'une des autorisations suivantes dans votre fichier manifeste :
Demandez et obtenez au moins l'une des autorisations d'exécution suivantes:
Appeler
UsbManager.requestPermission()
- Description
Interactions avec des appareils externes nécessitant une connexion Bluetooth, NFC, IR, USB ou réseau.
- Autres solutions
Si votre application doit effectuer un transfert de données continu vers un appareil externe, envisagez d'utiliser le gestionnaire d'appareils associés à la place. Utilisez l'API de présence de l'appareil associé pour que votre application reste en cours d'exécution lorsque l'appareil associé est à portée.
Si votre application doit rechercher des appareils Bluetooth, envisagez plutôt d'utiliser l'API de recherche Bluetooth.
Synchroniser les données
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypedataSync- 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é
- Foreground service type to declare in manifest under
android:foregroundServiceTypehealth- Permission to declare in your manifest
FOREGROUND_SERVICE_HEALTH- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_HEALTH- Runtime prerequisites
At least one of the following conditions must be true:
Declare the
HIGH_SAMPLING_RATE_SENSORSpermission in your manifest.Request and be granted at least one of the following runtime permissions:
BODY_SENSORSon API level 35 and lowerREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
Note: The
BODY_SENSORSand sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create ahealthforeground service that uses body sensors while your app is in the background unless you've been granted theBODY_SENSORS_BACKGROUND(API level 33 to 35) orREAD_HEALTH_DATA_IN_BACKGROUND(API level 36 and higher) permissions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Any long-running use cases to support apps in the fitness category such as exercise trackers.
Localisation
- Foreground service type to declare in manifest under
android:foregroundServiceTypelocation- Permission to declare in your manifest
FOREGROUND_SERVICE_LOCATION- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_LOCATION- Runtime prerequisites
The user must have enabled location services and the app must be granted at least one of the following runtime permissions:
Note: In order to check that the user has enabled location services as well as granted access to the runtime permissions, use
PermissionChecker#checkSelfPermission()Note: The location runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a
locationforeground service while your app is in the background, unless you've been granted theACCESS_BACKGROUND_LOCATIONruntime permission. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Long-running use cases that require location access, such as navigation and location sharing.
- Alternatives
If your app needs to be triggered when the user reaches specific locations, consider using the geofence API instead.
Contenus multimédias
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypemediaPlayback- 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
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypemediaProjection- Autorisation à déclarer dans votre fichier manifeste
FOREGROUND_SERVICE_MEDIA_PROJECTION- Constante à transmettre à
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- Conditions préalables d'exécution
Appelez la méthode
createScreenCaptureIntent()avant de démarrer le service de premier plan. Une notification d'autorisation s'affiche alors auprès de l'utilisateur. Celui-ci doit accorder l'autorisation avant que vous puissiez créer le service.Une fois le service de premier plan créé, vous pouvez appeler
MediaProjectionManager.getMediaProjection().- Description
Projetez du contenu sur un écran externe ou un appareil externe à l'aide des API
MediaProjection. Il ne doit pas nécessairement s'agir de contenu exclusivement multimédia.- Autres solutions
Pour diffuser des contenus multimédias en streaming sur un autre appareil, utilisez le SDK Google Cast.
Micro
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypemicrophone- 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_AUDIOet obtenez-la.Remarque:L'autorisation d'exécution
RECORD_AUDIOest soumise à des restrictions d'utilisation. Pour cette raison, vous ne pouvez pas créer de service de premier planmicrophonelorsque 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:foregroundServiceTypephoneCall- 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_CALLSpermission in its manifest file.
- App has declared the
- App is the default dialer app through the
ROLE_DIALERrole.
- App is the default dialer app through the
- Description
Continue an ongoing call using the
ConnectionServiceAPIs.- Alternatives
If you need to make phone, video, or VoIP calls, consider using the
android.telecomlibrary.Consider using
CallScreeningServiceto screen calls.
Messagerie à distance
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTyperemoteMessaging- 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
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypeshortService- Autorisation à déclarer dans votre fichier manifeste
- Aucune
- Constante à transmettre à
startForeground() FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Conditions préalables d'exécution
- Aucune
- Description
Finalisez rapidement les tâches essentielles qui ne peuvent pas être interrompues ni reportées.
Ce type présente des caractéristiques uniques :
- Il ne peut être exécuté que sur une courte période (environ trois minutes).
- Il est incompatible avec les services de premier plan persistants.
- Il ne peut démarrer d'autres services de premier plan.
- Il ne nécessite pas d'autorisation spécifique à un type, bien que l'autorisation
FOREGROUND_SERVICEreste nécessaire. - Un
shortServicene peut passer à un autre type de service que si l'application est actuellement éligible au démarrage d'un nouveau service de premier plan. - Un service de premier plan peut modifier son type en
shortServiceà tout moment, à partir de quoi le délai avant expiration commence.
Le délai d'inactivité pour shortService commence à partir du moment où
Service.startForeground()est appelé. L'application doit appelerService.stopSelf()ouService.stopForeground()avant l'expiration du délai. Sinon, le nouveauService.onTimeout()est appelé, ce qui permet aux applications d'appeler brièvementstopSelf()oustopForeground()pour arrêter leur service.Peu après l'appel de
Service.onTimeout(), l'application passe dans un état mis en cache et n'est plus considérée comme étant de premier plan, sauf si l'utilisateur interagit activement avec elle. Peu de temps après la mise en cache de l'application et l'arrêt du service, celle-ci reçoit une erreur ANR. Le message ANR mentionneFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Pour ces raisons, il est recommandé d'implémenter le rappelService.onTimeout().Le rappel
Service.onTimeout()n'existe pas sur Android 13 ou version antérieure. Si le même service s'exécute sur ces appareils, il ne reçoit pas de délai d'inactivité ni d'erreur ANR. Assurez-vous que votre service s'arrête dès la fin de la tâche de traitement, même s'il n'a pas encore reçu le rappelService.onTimeout().Notez que si le délai d'expiration de
shortServicen'est pas respecté, l'application sera ANR, même si d'autres services de premier plan valides ou d'autres processus de cycle de vie de l'application sont en cours d'exécution.Si une application est visible par l'utilisateur ou qu'elle satisfait l'une des exceptions permettant de démarrer les services de premier plan en arrière-plan, appeler à nouveau
Service.StartForeground()avec le paramètreFOREGROUND_SERVICE_TYPE_SHORT_SERVICEprolonge le délai avant expiration de trois minutes. Si l'application n'est pas visible par l'utilisateur et qu'elle ne satisfait pas l'une des exceptions, toute tentative de démarrage d'un autre service de premier plan, quel que soit son type, entraîne uneForegroundServiceStartNotAllowedExceptionSi un utilisateur désactive l'optimisation de la batterie pour votre application, cette dernière sera toujours affectée par le délai d'inactivité du shortService du service de premier plan.
Si vous démarrez un service de premier plan qui inclut le type
shortServiceet un autre type de service de premier plan, le système ignore la déclaration du typeshortService. Toutefois, le service doit toujours respecter les conditions préalables des autres types déclarés. Pour en savoir plus, consultez la documentation sur les services de premier plan.
Utilisation spéciale
- Type de service de premier plan à déclarer dans le fichier manifeste sous
android:foregroundServiceTypespecialUse- 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:foregroundServiceTypesystemExempted- 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_ALARMouUSE_EXACT_ALARMet 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.