WakeLock : ce que c’est, types et gestion du verrouillage du sommeil

Auteur : IT Sectr Publié le : 2026-03-28 Temps de lecture : 9 min

WakeLock est un mécanisme Android qui empêche l’appareil de passer en mode veille en maintenant le processeur ou l’écran actif. Les tâches en arrière-plan, telles que les téléchargements de fichiers, la lecture audio ou l’enregistrement de données, nécessitent WakeLock pour une exécution garantie sans interruptions. Selon la spécification Android Developers, 2025, une utilisation incorrecte de WakeLock entraîne un épuisement rapide de la batterie et peut provoquer le blocage de l’application sur Google Play.

Points clés

  • WakeLock — un verrou de sommeil qui maintient l’appareil actif
  • Types — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK et autres
  • Autorisation — WAKE_LOCK requise dans le manifeste mais pas demandée à l’exécution
  • Risques — un WakeLock non libéré épuise la batterie et dégrade l’expérience utilisateur
  • Alternatives — WorkManager, Foreground Service, JobScheduler réduisent le besoin de WakeLock

Qu’est-ce que WakeLock

WakeLock est un verrou système qui empêche Android de mettre l’appareil en mode basse consommation. Normalement, après quelques secondes d’inactivité de l’utilisateur, Android éteint l’écran et met le processeur en état de sommeil profond (deep sleep), suspendant les threads en arrière-plan. WakeLock empêche cette transition en maintenant le processeur actif.

Le mécanisme WakeLock est géré via le service système PowerManager, accessible par la méthode getSystemService(Context.POWER_SERVICE). Le développeur crée un objet WakeLock, spécifie le type de verrouillage et doit le libérer de manière garantie après la fin de la tâche, sinon la batterie de l’appareil s’épuisera rapidement. Le système ne libère pas WakeLock automatiquement — c’est la responsabilité de l’application.

Avec chaque version majeure d’Android, Google renforce le contrôle sur WakeLock. À partir d’Android 9 (API 28), une application en arrière-plan ne peut pas acquérir WakeLock sans raison valable, et le système surveille les applications qui abusent des verrous et peut les libérer de force. Dans Android 12+, des restrictions supplémentaires sur l’accès à PowerManager pour les applications en arrière-plan ont été introduites.

Quand WakeLock est nécessaire

WakeLock est nécessaire dans les scénarios où une tâche ne peut pas être interrompue par la mise en veille de l’appareil : téléchargement d’un fichier volumineux sur une connexion instable, enregistrement vidéo, exécution de longs calculs sans interaction utilisateur. Sans verrou de sommeil, le processeur entre en sommeil profond, tous les threads sont gelés et la tâche reste incomplète.

Cependant, Google recommande fortement de minimiser l’utilisation de WakeLock. Dans la plupart des cas, la même tâche peut être résolue avec Foreground Service avec notification, WorkManager ou JobScheduler. Ces mécanismes tiennent compte de l’état de la batterie et du réseau, ce qui prolonge l’autonomie de l’appareil.

Comment fonctionne WakeLock

WakeLock fonctionne via le service système PowerManager, qui gère l’état d’alimentation de l’appareil. Lorsqu’une application demande un verrou via powerManager.newWakeLock(), le système augmente le niveau d’activité du processeur, empêchant le sommeil profond. Après avoir appelé wakeLock.release(), le système revient en mode d’économie d’énergie normal.

Il est important de comprendre que WakeLock n’empêche pas tous les modes d’économie d’énergie. Le Mode Doze (mode veille d’Android 6+) peut ignorer WakeLock dans certaines phases — une application maintenant un WakeLock n’aura pas accès au réseau pendant les fenêtres de maintenance de Doze. Cela signifie que même un WakeLock actif ne garantit pas les opérations réseau pendant la deuxième phase de Doze.

Chaque WakeLock est associé à un PowerManager.WakeLock côté framework. Le système compte les verrous actifs au niveau du processus : si un processus maintient plusieurs WakeLocks, ils s’accumulent et la libération ne se produit qu’après avoir appelé release() pour chaque verrou. Android prend également en charge les timeouts de wake lock — libération automatique après un intervalle spécifié. Cependant, il n’est pas recommandé de compter sur le timeout : la tâche peut se terminer plus tôt et le temps de maintien supplémentaire réduira l’autonomie de la batterie.

WakeLock et événements système

Lorsque l’appareil passe en mode veille (bouton d’alimentation), Android libère de force tous les SCREEN_DIM_WAKE_LOCK et SCREEN_BRIGHT_WAKE_LOCK mais conserve PARTIAL_WAKE_LOCK. Cela signifie qu’un verrou d’écran ne peut pas maintenir l’affichage allumé — seul PARTIAL_WAKE_LOCK peut continuer à fonctionner après avoir appuyé sur le bouton d’alimentation.

Types de WakeLock dans Android

Android dispose de plusieurs types de WakeLock, chacun contrôlant des composants spécifiques de l’appareil. Le choix du type détermine quels composants matériels restent actifs après le verrouillage. Choisir le mauvais type entraîne une consommation d’énergie excessive en raison du maintien de modules inutiles allumés.

TypeProcesseurÉcranClavierQuand l’utiliser
PARTIAL_WAKE_LOCKAlluméÉteintÉteintTéléchargements, calculs
SCREEN_DIM_WAKE_LOCKAlluméTamiseurÉteintLecteur vidéo, présentation
SCREEN_BRIGHT_WAKE_LOCKAlluméLumineuxÉteintJeux (obsolète)
FULL_WAKE_LOCKAlluméLumineuxLumineuxObsolète (deprecated)

PARTIAL_WAKE_LOCK — type principal

PARTIAL_WAKE_LOCK est le type le plus utilisé et recommandé. Il maintient le processeur actif mais permet à l’écran et au rétroéclairage du clavier de s’éteindre. C’est le choix optimal pour les tâches en arrière-plan : chargement de données, traitement d’images, synchronisation. L’écran s’éteint après le délai d’attente du système, économisant la batterie tout en effectuant un travail invisible pour l’utilisateur.

Types obsolètes (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK et FULL_WAKE_LOCK sont obsolètes depuis Android 7 (API 24). Ils maintiennent l’écran allumé, entraînant une consommation importante de la batterie. Google recommande d’utiliser FLAG_KEEP_SCREEN_ON via Activity.getWindow().addFlags() à la place — ce drapeau ne fonctionne que lorsque l’Activity est active et ne nécessite pas l’autorisation WAKE_LOCK, tandis que le système gère automatiquement le temps de maintien de l’écran.

WakeLock et consommation d’énergie

WakeLock est l’un des principaux consommateurs de batterie sur Android. Chaque seconde de maintien d’un verrou de sommeil consomme de l’énergie supplémentaire car le processeur ne peut pas passer dans un état C économe en énergie. Les recherches du Google Power Dashboard montrent que les applications avec des WakeLocks mal libérés peuvent augmenter la consommation d’énergie de l’appareil de 30–50% en mode veille.

Le système suit les applications qui abusent de WakeLock via le composant Battery Historian. Le développeur peut analyser le profil de consommation d’énergie et identifier les fuites de verrous — des situations où un WakeLock a été créé mais pas libéré. La Google Play Console affiche les statistiques WakeLock pour les applications publiées, et un temps de maintien élevé peut entraîner de mauvaises évaluations.

Le Mode Doze et App Standby restreignent davantage le fonctionnement de WakeLock. Dans la première phase de Doze (Light Doze), le système autorise WakeLock dans de courtes fenêtres de maintenance. Dans la deuxième phase (Deep Doze), WakeLock est fusionné avec d’autres verrous et exécuté dans une fenêtre commune. Si une application maintient un WakeLock pendant plus de 10 minutes sans interaction utilisateur, le système peut le libérer de force et ajouter l’application à la liste noire d’optimisation de la batterie.

  • Battery Historian — outil d’analyse de la consommation d’énergie et des fuites WakeLock
  • Mode Doze — restreint WakeLock dans les fenêtres de maintenance, fusionne les verrous
  • Google Play Console — affiche les statistiques WakeLock pour les applications publiées
  • Liste noire — l’application peut être marquée par le système comme énergivore

Bonnes pratiques d’utilisation

L’utilisation correcte de WakeLock est un équilibre entre la nécessité d’accomplir une tâche et le souci de la batterie de l’appareil. Google recommande de suivre plusieurs principes : toujours libérer WakeLock dans un bloc finally ou via acquire(timeout), utiliser le type de verrouillage minimal nécessaire et éviter les maintiens prolongés sans nécessité absolue.

Règle de libération

WakeLock doit être libéré dans le même bloc de code où il a été créé. Pour garantir la libération en cas d’exceptions, on utilise la construction try-finally ou le bloc use de Kotlin. Sur Android 10+, le système affiche un avertissement dans logcat si un WakeLock est maintenu pendant plus de 60 secondes : "WakeLock held for more than 60 seconds" — cela signale une fuite possible.

Timeout d’acquisition

La méthode acquire(long timeout) libère automatiquement WakeLock après le temps spécifié en millisecondes. C’est une sauvegarde au cas où le code de libération ne s’exécute pas en raison d’une exception ou d’un bug. Il est recommandé de toujours spécifier un timeout égal au temps d’exécution maximal attendu de la tâche plus une marge de 10–20%.

Vérification de l’état du verrou

Avant d’appeler release(), il faut vérifier si WakeLock est actuellement maintenu. Appeler release() à nouveau sans acquire() préalable provoque une RuntimeException: WakeLock under-locked. Il est recommandé de stocker un indicateur d’état (isHeld) et de vérifier wakeLock.isHeld() avant de libérer.

Utilisation de WakeLock en Kotlin

Examinons la création et la libération correctes de WakeLock en Kotlin. L’exemple montre le chargement asynchrone de données avec maintien de PARTIAL_WAKE_LOCK, une libération garantie dans un bloc try-finally et un timeout spécifié comme protection contre les fuites. Le service utilise CoroutineScope avec le dispatcher IO pour l’exécution de tâches en arrière-plan.

kotlin
class DownloadService : Service() {

    private lateinit var wakeLock: PowerManager.WakeLock
    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun onCreate() {
        super.onCreate()
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        wakeLock = powerManager.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK,
            "download:wakelock"
        )
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        wakeLock.acquire(60000)
        scope.launch {
            try {
                downloadFile()
            } finally {
                if (wakeLock.isHeld()) {
                    wakeLock.release()
                }
            }
        }
        return START_NOT_STICKY
    }

    private suspend fun downloadFile() {
        // Simulation de téléchargement de fichier
        delay(30000)
    }

    override fun onDestroy() {
        super.onDestroy()
        scope.cancel()
        if (wakeLock.isHeld()) {
            wakeLock.release()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

Déclaration de l’autorisation dans le manifeste

Pour utiliser WakeLock, il faut ajouter l’autorisation dans AndroidManifest.xml. L’autorisation WAKE_LOCK est une autorisation normale — elle ne nécessite pas de demande d’exécution à l’utilisateur et est accordée automatiquement lors de l’installation de l’application. Cependant, Google Play peut refuser la publication si l’application n’a pas de cas d’utilisation évident pour WakeLock.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

Alternatives à WakeLock

WakeLock est un mécanisme de bas niveau, et Google recommande de le remplacer par des API plus modernes lorsque c’est possible. La principale alternative est Foreground Service avec une notification, qui maintient automatiquement le verrou du processeur pendant la durée du service. Le système gère lui-même WakeLock pour Foreground Service, libérant le développeur de l’acquisition et de la libération explicites.

WorkManager est le deuxième outil le plus important pour les tâches en arrière-plan. Il garantit l’exécution des tâches même lorsque l’appareil entre en mode Doze et après un redémarrage. WorkManager prend en charge un verrou interne (hold lock) — le développeur n’a pas besoin de travailler explicitement avec PowerManager. La tâche s’exécute dans la fenêtre de maintenance de Doze avec une gestion automatique du verrou de sommeil.

Pour les tâches récurrentes nécessitant un timing précis, on utilise AlarmManager avec setAndAllowWhileIdle(), qui peut réveiller l’appareil de Doze. Cependant, AlarmManager ne convient que pour les opérations courtes — il n’est pas conçu pour un maintien prolongé de WakeLock. Si une tâche prend plus de 10 secondes, combinez AlarmManager avec un BroadcastReceiver qui lance un Foreground Service.

  • Foreground Service — gestion automatique de WakeLock avec notification
  • WorkManager — exécution garantie avec prise en charge de Doze et du redémarrage
  • JobScheduler — planification avec réseau, charge et inactivité
  • AlarmManager — réveil de l’appareil pour des tâches courtes planifiées

Foire aux questions

Qu’est-ce que WakeLock dans Android

WakeLock est un verrou système qui empêche un appareil Android d’entrer en mode veille. Il maintient le processeur ou l’écran actif, permettant aux tâches en arrière-plan (téléchargements, calculs) de s’exécuter sans interruption. Il est géré via le service système PowerManager.

Quels types de WakeLock existent

Les principaux types sont : PARTIAL_WAKE_LOCK (processeur actif, écran éteint) — recommandé ; SCREEN_DIM_WAKE_LOCK (processeur + écran tamisé) ; SCREEN_BRIGHT_WAKE_LOCK (processeur + écran lumineux). SCREEN_DIM, SCREEN_BRIGHT et FULL_WAKE_LOCK sont obsolètes et remplacés par FLAG_KEEP_SCREEN_ON.

Une autorisation est-elle nécessaire pour WakeLock

Oui, il faut déclarer android.permission.WAKE_LOCK dans le manifeste. C’est une autorisation normale qui est accordée automatiquement lors de l’installation — aucune demande d’exécution n’est nécessaire. Sans cette autorisation, l’appel à newWakeLock() retournera null ou lancera une SecurityException.

Que se passe-t-il si je ne libère pas un WakeLock

Si release() n’est pas appelé, l’appareil ne peut pas passer en mode veille. La batterie se déchargera considérablement plus vite (jusqu’à 50% de consommation supplémentaire). Le système enregistrera la fuite dans logcat et Battery Historian affichera un temps de maintien anormal de WakeLock, entraînant de mauvaises évaluations des utilisateurs.

Quoi peut remplacer WakeLock dans les applications modernes

Pour les tâches longues, utilisez Foreground Service avec une notification — le système gère WakeLock lui-même. Pour les tâches différées et garanties, utilisez WorkManager, qui prend en charge WakeLock en interne. Pour les tâches courtes planifiées, utilisez AlarmManager.

Résumé

  • WakeLock — un verrou de sommeil qui maintient le processeur ou l’écran d’un appareil Android actif
  • PARTIAL_WAKE_LOCK — le type principal pour les tâches en arrière-plan ; écran éteint, processeur reste actif
  • Autorisation — WAKE_LOCK dans le manifeste (autorisation normale, pas d’exécution requise)
  • Fuites — un WakeLock non libéré épuise la batterie de 30–50% ; libérer dans finally ou via timeout
  • Obsolète — SCREEN_DIM, SCREEN_BRIGHT et FULL_WAKE_LOCK remplacés par FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternative avec gestion automatique de WakeLock et notification
  • WorkManager — le meilleur choix pour les tâches en arrière-plan différées avec exécution garantie

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.

Discuter du projet

Lisez aussi