Un Foreground Service est un service Android qui exécute des opérations de longue durée visibles pour l'utilisateur avec une notification obligatoire dans la barre d'état. Contrairement au Background Service, que le système peut arrêter en cas de manque de ressources, le Foreground Service reçoit une priorité élevée et continue de fonctionner même dans des conditions de mémoire limitée. Selon la documentation Android Developers, 2025, Foreground Service reste le seul moyen fiable d'effectuer des tâches de longue durée sur les appareils fonctionnant sous Android 12 et versions ultérieures.
Points clés
Foreground Service est un composant Android conçu pour effectuer des opérations que l'utilisateur connaît et voit. Il affiche une notification persistante dans le panneau de notifications qui ne peut pas être balayée — elle reste active tant que le service est en cours d'exécution. C'est la principale différence avec un service d'arrière-plan, qui fonctionne sans que l'utilisateur le remarque.
Le système Android considère Foreground Service comme un processus d'une importance critique. Lorsque la RAM est faible, la plateforme termine d'abord les Background Services, puis les Activities mises en cache, et seulement dans des cas exceptionnels — le Foreground Service. L'OOM Killer attribue à un tel service un niveau ADJ de 2, ce qui élimine pratiquement sa terminaison forcée.
Pour lancer un Foreground Service, le développeur doit appeler la méthode startForeground() dans les quelques secondes suivant la création du service, sinon le système génère une exception ForegroundServiceDidNotStartInTimeException. Il s'agit d'une exigence stricte de la plateforme introduite pour empêcher les tâches d'arrière-plan non déclarées.
Le mécanisme Foreground Service a été introduit dans Android 1.0 avec le premier SDK, mais la notification obligatoire est apparue dans Android 9 (API 28). Avant cela, un service pouvait s'exécuter au premier plan sans indicateur visible pour l'utilisateur. À partir d'Android 9, Google a renforcé les exigences : toute application appelant startForeground doit fournir une notification dans les 5 secondes suivant le démarrage du service.
Dans Android 12 (API 31), des restrictions ont été ajoutées pour le lancement de Foreground Service à partir d'un contexte d'arrière-plan — désormais, l'autorisation FOREGROUND_SERVICE_SPECIAL_USE est requise pour de nombreux scénarios. Android 14 (API 34) a introduit la déclaration obligatoire de foregroundServiceType dans le manifeste, rendant l'architecture des services plus transparente et prévisible.
Le mécanisme de fonctionnement de Foreground Service repose sur trois étapes clés : création du service, liaison de la notification et exécution de la tâche. Le service hérite de la classe Service et redéfinit la méthode onStartCommand(), dans laquelle startForeground() est appelé avec un identifiant et un objet Notification.
Après avoir appelé startForeground(), le système déplace le processus du service dans le groupe de premier plan avec une priorité de survie accrue. Cela signifie qu'Android tentera de maintenir le processus en fonctionnement indépendamment de la charge de RAM. Foreground Service ne peut pas être arrêté par le système dans des conditions normales — seulement par le balayage de la notification par l'utilisateur ou par un appel explicite à stopSelf().
Le cycle de vie de Foreground Service est géré via les méthodes onCreate(), onStartCommand() et onDestroy(). Dans onStartCommand(), le développeur définit la stratégie de redémarrage après la suppression du processus — la constante START_STICKY force le système à recréer le service après la récupération des ressources, tandis que START_NOT_STICKY empêche le redémarrage automatique.
Au démarrage de Foreground Service, les étapes sont exécutées séquentiellement : appel à startService(), création de l'objet Service dans onCreate(), traitement de l'Intent dans onStartCommand() et appel à startForeground() avec un objet Notification. Si le service est déjà en cours d'exécution et qu'un nouvel Intent arrive, seul onStartCommand() est appelé à nouveau — onCreate() n'est exécuté qu'une seule fois pendant la durée de vie du service.
L'arrêt de Foreground Service se fait via stopForeground() avec le drapeau REMOVE_NOTIFICATION, qui masque la notification de la barre d'état. Immédiatement après la suppression de la notification, le système peut cesser de considérer le service comme de premier plan et réduire sa priorité à Background Service, rendant le processus vulnérable à la terminaison.
PowerManager joue un rôle important dans le fonctionnement de Foreground Service, car les modes d'économie d'énergie d'Android (Doze, App Standby) peuvent limiter sa capacité à exécuter des tâches. Même en état de premier plan, le service est soumis aux politiques de batterie — les requêtes réseau peuvent être différées et les temporisateurs synchronisés avec les fenêtres Doze. Pour les opérations de longue durée tolérantes aux retards, il est recommandé d'utiliser Foreground Service en combinaison avec WorkManager.
À partir d'Android 14 (API 34), Google a introduit la déclaration obligatoire du type de Foreground Service dans le manifeste. Chaque type définit un scénario d'utilisation autorisé — le système vérifie la conformité entre le type déclaré et le comportement réel du service. Il existe 9 types au total, mais les plus couramment utilisés sont les suivants.
Le type dataSync est conçu pour la synchronisation des données entre l'appareil et le serveur, les transferts de fichiers et les sauvegardes. Les exemples incluent le téléchargement de photos vers le stockage cloud, la synchronisation de la base de données avec Firebase ou le téléchargement de journaux vers un serveur distant. Ce type nécessite de spécifier la justification dans le manifeste via l'attribut android:foregroundServiceType="dataSync".
Le type mediaPlayback est utilisé pour la lecture audio et vidéo en arrière-plan — lecteurs de musique, clients de podcasts, lecteurs vidéo. C'est le seul type qui peut fonctionner indéfiniment sans intervention de l'utilisateur. Le canal de notification doit avoir une priorité élevée et afficher les contrôles de lecture — boutons de lecture, pause, suivant, précédent via MediaStyle.
Le type location est destiné aux services de géolocalisation — applications de navigation, suivi d'activité, géorepérage. Pour Android 14+, il est nécessaire de déclarer l'autorisation FOREGROUND_SERVICE_LOCATION et de spécifier le type dans le manifeste. L'application doit disposer d'une autorisation de localisation active au moment de l'exécution, sinon le système refusera de démarrer le service.
| Type | Autorisation | Exemple d'utilisation |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Synchronisation de fichiers avec le cloud |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Lecteur de musique en arrière-plan |
| location | FOREGROUND_SERVICE_LOCATION | GPS de navigation en conduisant |
| camera | FOREGROUND_SERVICE_CAMERA | Application de vidéosurveillance |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Travail avec un périphérique BLE |
La différence clé entre Foreground et Background Service est la présence d'une notification visible et de la priorité de survie. Le Background Service peut être arrêté par le système à tout moment en cas de manque de mémoire, tandis que le Foreground Service continue de fonctionner grâce au niveau adj élevé du processus dans le mécanisme Low Memory Killer d'Android.
Le Background Service ne nécessite pas de notification et peut s'exécuter sans que l'utilisateur le remarque. Cependant, à partir d'Android 8 (API 26), Google a considérablement restreint les services d'arrière-plan : startService() à partir d'un contexte d'arrière-plan ne fonctionne plus, et Context.startForegroundService() est devenu obligatoire pour lancer tout service qui prévoit de passer au premier plan. Le système a également introduit des Limites d'exécution en arrière-plan — un minuteur (actuellement 10 minutes) après lequel le Background Service est arrêté de force.
Le Foreground Service, en revanche, n'a pas de limite de temps. Le service peut fonctionner pendant des heures ou des jours — jusqu'à ce que l'utilisateur l'arrête explicitement ou redémarre l'appareil. Cela fait de Foreground Service le choix optimal pour les applications qui nécessitent un travail continu en arrière-plan : lecteurs de musique, trackers d'activité, applications d'appels VoIP.
| Paramètre | Foreground Service | Background Service |
|---|---|---|
| Notification | Obligatoire | Non requise |
| Durée de vie | Sans limite | Jusqu'à 10 minutes (API 26+) |
| Priorité système | Élevée (ADJ 2) | Basse (ADJ 8+) |
| Lancement API 26+ | startForegroundService() | Interdit depuis l'arrière-plan |
À partir d'Android 12 (API 31), Google a introduit des restrictions significatives sur le lancement de Foreground Service. Le changement principal est l'interdiction d'appeler startForegroundService() à partir d'un contexte d'arrière-plan pour la plupart des types de services. Les exceptions ne s'appliquent que lorsque l'utilisateur a explicitement consenti (par exemple, via l'autorisation FOREGROUND_SERVICE_SPECIAL_USE) ou lorsque le service est lancé en réponse à l'intention de diffusion BOOT_COMPLETED.
Le manifeste de l'application ciblant l'API 34+ doit contenir un bloc foregroundServiceType pour chaque service déclaré. Par exemple, pour un service de synchronisation de données, spécifiez android:foregroundServiceType="dataSync". Si le type n'est pas spécifié, le système considère le service comme invalide et lève une exception MissingForegroundServiceTypeException lors de la tentative de démarrage. Google Play vérifie également la conformité des types et peut refuser la publication en cas de non-concordance.
Dans Android 14 (API 34), chaque type de Foreground Service a une autorisation correspondante. Le développeur doit les déclarer dans le manifeste et les demander au moment de l'exécution avant de démarrer le service. Pour dataSync, FOREGROUND_SERVICE_DATA_SYNC est requis ; pour mediaPlayback, FOREGROUND_SERVICE_MEDIA_PLAYBACK est requis. L'utilisateur peut révoquer l'autorisation dans les paramètres, ce qui arrêtera le service actif.
Google a également introduit le mécanisme Foreground Service Notification Timeout dans Android 14 : si le service n'appelle pas startForeground() dans les 10 secondes suivant sa création, le système lève une exception. Ce durcissement vise à lutter contre les applications qui retardent ou sautent l'appel de notification, fonctionnant en réalité comme un Background Service déguisé en premier plan.
Foreground Service est utilisé dans un large éventail de tâches nécessitant une exécution garantie en arrière-plan. Les scénarios les plus courants incluent la lecture multimédia, le suivi de géolocalisation, la synchronisation de données et le travail avec des périphériques. Examinons chacun d'eux en détail.
Un exemple classique est un lecteur de musique qui continue la lecture après la réduction de l'application. Le service démarre avec une notification MediaStyle, des boutons de contrôle et utilise le type mediaPlayback. L'utilisateur voit les informations sur le morceau dans la barre d'état et peut contrôler la lecture sans ouvrir l'application.
Les applications de navigation utilisent Foreground Service de type location pour le suivi continu des coordonnées. Le service affiche une notification avec la vitesse actuelle, le temps de trajet et un bouton pour arrêter le suivi. Sans Foreground Service, le système cesserait de recevoir les coordonnées en arrière-plan après quelques minutes, rendant la navigation impossible.
Les applications d'appels vocaux et vidéo — clients VoIP — utilisent Foreground Service pour maintenir une connexion active. Le service de type phoneCall (depuis Android 14) garantit qu'un appel ne sera pas interrompu lors de la réduction de l'application. La notification affiche la durée de l'appel et les contrôles du microphone et du haut-parleur.
Voyons la création d'un Foreground Service en Kotlin pour la synchronisation de données. Le service sera lancé à partir d'une Activity, affichera une notification avec progression et se terminera correctement après la fin. L'exemple montre tous les éléments obligatoires : déclaration dans le manifeste, canal de notification, appel à startForeground() et gestion de foregroundServiceType.
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"Synchronisation",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Canal de synchronisation de données"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Synchronisation")
.setContentText("Téléchargement de données vers le serveur")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Émulation de synchronisation
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Pour que le service fonctionne correctement sur Android 12+, vous devez déclarer le Foreground Service dans AndroidManifest.xml en spécifiant le type et les autorisations nécessaires. L'attribut foregroundServiceType est obligatoire pour l'API cible 34+, et les autorisations FOREGROUND_SERVICE_DATA_SYNC et POST_NOTIFICATIONS doivent être demandées au moment de l'exécution.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
Malgré sa grande fiabilité, Foreground Service a des limitations. La principale est la visibilité pour l'utilisateur. L'application ne peut pas effectuer de tâches longues en arrière-plan sans notification, ce qui n'est pas toujours acceptable du point de vue de l'UX. De plus, le système peut forcer l'arrêt même d'un Foreground Service lorsque la limite de temps pour certains types est dépassée — par exemple, dataSync est limité à plusieurs heures de fonctionnement.
Une alternative à Foreground Service est WorkManager, une bibliothèque Android Jetpack pour les tâches différées et d'arrière-plan. WorkManager garantit l'exécution de la tâche même après le redémarrage de l'appareil et prend en charge les chaînes de tâches, les opérations périodiques et les contraintes de réseau et de batterie. Pour la plupart des opérations d'arrière-plan, Google recommande WorkManager plutôt qu'un service direct.
JobScheduler est une API Android intégrée pour planifier des tâches. Il convient aux opérations qui peuvent être différées : synchronisation Wi-Fi, téléchargement de données lors de la connexion au chargeur. JobScheduler regroupe les tâches en fenêtres pour économiser la batterie, contrairement à Foreground Service qui fonctionne en continu indépendamment de l'état d'économie d'énergie.
Pour les tâches courtes (jusqu'à 10–15 secondes), vous pouvez utiliser CoroutineWorker de WorkManager avec une exécution retardée. Si une tâche doit être exécutée strictement à un moment précis, AlarmManager est utilisé avec BroadcastReceiver. Ainsi, Foreground Service est une solution pour les opérations continues de longue durée, pas un outil universel pour tous les scénarios d'arrière-plan.
Foire aux questions
Foreground Service est un service Android avec une notification persistante dans la barre d'état qui effectue des tâches de longue durée visibles pour l'utilisateur. Il a une priorité de survie élevée et n'est pas arrêté par le système en cas de manque de mémoire, contrairement au Background Service.
Foreground Service affiche une notification obligatoire, n'a pas de limite de temps et est protégé contre l'arrêt par le système. Background Service est invisible pour l'utilisateur, fonctionne jusqu'à 10 minutes (API 26+) et peut être arrêté à tout moment par Low Memory Killer.
Android 14 définit 9 types : dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health et remoteMessaging. Chaque type nécessite une autorisation correspondante et une déclaration dans le manifeste via l'attribut foregroundServiceType.
Si le service n'appelle pas startForeground() dans les 10 secondes suivant sa création (Android 14), le système lève une exception ForegroundServiceDidNotStartInTimeException et arrête le service de force. L'application recevra également une ANR (Application Not Responding) si l'opération est exécutée sur le thread principal.
Non, il est impossible de masquer la notification de Foreground Service par programmation. Depuis Android 9 (API 28), la notification est obligatoire et ne peut pas être balayée par l'utilisateur. La seule façon de la supprimer est d'arrêter le service en appelant stopForeground(REMOVE_NOTIFICATION) et stopSelf().
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi