WakeLock es un mecanismo de Android que evita que el dispositivo entre en modo de suspensión manteniendo la CPU o la pantalla activa. Las tareas en segundo plano, como la descarga de archivos, la reproducción de audio o la grabación de datos, requieren WakeLock para una ejecución garantizada sin interrupciones. Según la especificación de Android Developers, 2025, el uso incorrecto de WakeLock provoca un agotamiento rápido de la batería y puede hacer que la aplicación sea bloqueada en Google Play.
Puntos clave
WakeLock es un bloqueo del sistema que impide que Android ponga el dispositivo en modo de bajo consumo. Normalmente, después de unos segundos de inactividad del usuario, Android apaga la pantalla y pone la CPU en estado de sueño profundo (deep sleep), suspendiendo los hilos en segundo plano. WakeLock evita esta transición manteniendo la CPU activa.
El mecanismo WakeLock se gestiona a través del servicio del sistema PowerManager, al que se accede mediante el método getSystemService(Context.POWER_SERVICE). El desarrollador crea un objeto WakeLock, especifica el tipo de bloqueo y debe liberarlo garantizadamente después de completar la tarea; de lo contrario, la batería del dispositivo se agotará rápidamente. El sistema no libera WakeLock automáticamente — es responsabilidad de la aplicación.
Con cada lanzamiento importante de Android, Google endurece el control sobre WakeLock. A partir de Android 9 (API 28), una aplicación en segundo plano no puede adquirir WakeLock sin una razón válida, y el sistema supervisa las aplicaciones que abusan de los bloqueos y puede liberarlos forzosamente. En Android 12+ se introdujeron restricciones adicionales al acceso a PowerManager para aplicaciones en segundo plano.
Se requiere WakeLock en escenarios donde una tarea no puede ser interrumpida por la suspensión del dispositivo: descarga de un archivo grande en una conexión inestable, grabación de vídeo, realización de cálculos largos sin interacción del usuario. Sin un bloqueo de sueño, la CPU entra en sueño profundo, todos los hilos se congelan y la tarea queda incompleta.
Sin embargo, Google recomienda encarecidamente minimizar el uso de WakeLock. En la mayoría de los casos, la misma tarea se puede resolver con Foreground Service con una notificación, WorkManager o JobScheduler. Estos mecanismos tienen en cuenta el estado de la batería y la red, lo que prolonga la duración de la batería del dispositivo.
WakeLock funciona a través del servicio del sistema PowerManager, que gestiona el estado de alimentación del dispositivo. Cuando una aplicación solicita un bloqueo mediante powerManager.newWakeLock(), el sistema aumenta el nivel de actividad de la CPU, evitando el sueño profundo. Después de llamar a wakeLock.release(), el sistema vuelve al modo normal de ahorro de energía.
Es importante entender que WakeLock no evita todos los modos de ahorro de energía. Doze Mode (modo de suspensión de Android 6+) puede ignorar WakeLock en ciertas fases: una aplicación con un WakeLock retenido no obtendrá acceso a la red durante las ventanas de mantenimiento de Doze. Esto significa que incluso un WakeLock activo no garantiza operaciones de red durante la segunda fase de Doze.
Cada WakeLock está asociado con un PowerManager.WakeLock en el lado del framework. El sistema cuenta los bloqueos activos a nivel de proceso: si un proceso mantiene varios WakeLock, se acumulan y la liberación solo ocurre después de llamar a release() para cada bloqueo. Android también admite wake lock timeouts — liberación automática después de un intervalo determinado. Sin embargo, no se recomienda confiar en el timeout: la tarea puede completarse antes y el tiempo adicional de retención reducirá la duración de la batería.
Cuando el dispositivo entra en modo de suspensión (botón de encendido), Android libera forzosamente todos los SCREEN_DIM_WAKE_LOCK y SCREEN_BRIGHT_WAKE_LOCK, pero conserva PARTIAL_WAKE_LOCK. Esto significa que un bloqueo de pantalla no puede mantener la pantalla encendida — solo PARTIAL_WAKE_LOCK puede continuar funcionando después de presionar el botón de encendido.
Android tiene varios tipos de WakeLock, cada uno controlando componentes específicos del dispositivo. La elección del tipo determina qué componentes de hardware permanecen activos después del bloqueo. Elegir el tipo incorrecto provoca un consumo excesivo de energía debido a que se mantienen encendidos módulos innecesarios.
| Tipo | CPU | Pantalla | Teclado | Cuándo usarlo |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Encendido | Apagado | Apagado | Descarga de archivos, cálculos |
| SCREEN_DIM_WAKE_LOCK | Encendido | Oscuro | Apagado | Reproductor de vídeo, presentación |
| SCREEN_BRIGHT_WAKE_LOCK | Encendido | Brillante | Apagado | Juegos (obsoleto) |
| FULL_WAKE_LOCK | Encendido | Brillante | Brillante | Obsoleto (deprecated) |
PARTIAL_WAKE_LOCK es el tipo más utilizado y recomendado. Mantiene la CPU activa pero permite que la pantalla y la retroiluminación del teclado se apaguen. Es la opción óptima para tareas en segundo plano: carga de datos, procesamiento de imágenes, sincronización. La pantalla se apaga tras el tiempo de espera del sistema, ahorrando batería mientras se realiza un trabajo invisible para el usuario.
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK y FULL_WAKE_LOCK han quedado obsoletos desde Android 7 (API 24). Mantienen la pantalla encendida, lo que provoca un consumo significativo de batería. Google recomienda usar FLAG_KEEP_SCREEN_ON a través de Activity.getWindow().addFlags() en su lugar — esta bandera solo funciona cuando la Activity está activa y no requiere el permiso WAKE_LOCK, mientras que el sistema gestiona automáticamente el tiempo de retención de la pantalla.
WakeLock es uno de los principales consumidores de batería en Android. Cada segundo que se mantiene un bloqueo de sueño consume energía adicional porque la CPU no puede pasar a un estado C de bajo consumo. La investigación de Google Power Dashboard muestra que las aplicaciones con WakeLock liberados incorrectamente pueden aumentar el consumo de energía del dispositivo en un 30–50% en modo de espera.
El sistema rastrea las aplicaciones que abusan de WakeLock a través del componente Battery Historian. El desarrollador puede analizar el perfil de consumo de energía e identificar fugas de bloqueos: situaciones en las que se creó un WakeLock pero no se liberó. Google Play Console muestra estadísticas de WakeLock para aplicaciones publicadas, y un tiempo de retención elevado puede provocar malas reseñas.
Doze Mode y App Standby restringen aún más el funcionamiento de WakeLock. En la primera fase de Doze (Light Doze), el sistema permite WakeLock en ventanas de mantenimiento cortas. En la segunda fase (Deep Doze), WakeLock se combina con otros bloqueos y se ejecuta en una ventana común. Si una aplicación mantiene un WakeLock durante más de 10 minutos sin interacción del usuario, el sistema puede liberarlo forzosamente y añadir la aplicación a la lista negra de optimización de batería.
El uso correcto de WakeLock es un equilibrio entre la necesidad de completar una tarea y el cuidado de la batería del dispositivo. Google recomienda seguir varios principios: liberar siempre WakeLock en un bloque finally o mediante acquire(timeout), usar el tipo de bloqueo mínimo necesario y evitar retenciones prolongadas sin necesidad extrema.
WakeLock debe liberarse en el mismo bloque de código donde se creó. Para garantizar la liberación en caso de excepciones, se utiliza la construcción try-finally o el bloque use de Kotlin. En Android 10+, el sistema muestra una advertencia en logcat si un WakeLock se mantiene durante más de 60 segundos: "WakeLock held for more than 60 seconds" — esto indica una posible fuga.
El método acquire(long timeout) libera automáticamente WakeLock después del tiempo especificado en milisegundos. Esto es un seguro en caso de que el código de liberación no se ejecute debido a una excepción o error. Se recomienda especificar siempre un timeout igual al tiempo máximo esperado de ejecución de la tarea más un margen del 10–20%.
Antes de llamar a release(), se debe verificar si WakeLock está actualmente retenido. Llamar a release() nuevamente sin un acquire() previo provoca un RuntimeException: WakeLock under-locked. Se recomienda almacenar una bandera de estado (isHeld) y verificar wakeLock.isHeld() antes de liberar.
Veamos la creación y liberación correcta de WakeLock en Kotlin. El ejemplo demuestra la carga asíncrona de datos con retención de PARTIAL_WAKE_LOCK, liberación garantizada en un bloque try-finally y un timeout especificado como seguro contra fugas. El servicio utiliza CoroutineScope con el dispatcher IO para ejecutar la tarea en segundo plano.
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() {
// Simulando descarga de archivo
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Para usar WakeLock, es necesario añadir el permiso en AndroidManifest.xml. El permiso WAKE_LOCK es un permiso normal — no requiere solicitud en tiempo de ejecución al usuario y se concede automáticamente al instalar la aplicación. Sin embargo, Google Play puede rechazar la publicación si la aplicación no tiene un caso de uso evidente para WakeLock.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock es un mecanismo de bajo nivel, y Google recomienda reemplazarlo con APIs más modernas siempre que sea posible. La principal alternativa es Foreground Service con una notificación, que mantiene automáticamente el bloqueo de la CPU durante la duración del servicio. El propio sistema gestiona WakeLock para Foreground Service, liberando al desarrollador de la adquisición y liberación explícitas.
WorkManager es la segunda herramienta más importante para tareas en segundo plano. Garantiza la ejecución de la tarea incluso cuando el dispositivo entra en modo Doze y después de un reinicio. WorkManager admite un bloqueo interno (hold lock) — el desarrollador no necesita trabajar explícitamente con PowerManager. La tarea se ejecuta en la ventana de mantenimiento de Doze con gestión automática del bloqueo de sueño.
Para tareas periódicas que requieren una hora exacta, se utiliza AlarmManager con setAndAllowWhileIdle(), que puede despertar el dispositivo de Doze. Sin embargo, AlarmManager solo es adecuado para operaciones cortas — no está diseñado para mantener WakeLock durante mucho tiempo. Si una tarea dura más de 10 segundos, se debe combinar AlarmManager con un BroadcastReceiver que inicie un Foreground Service.
Preguntas frecuentes
WakeLock es un bloqueo del sistema que evita que un dispositivo Android entre en modo de suspensión. Mantiene la CPU o la pantalla activa, permitiendo que las tareas en segundo plano (descargas, cálculos) se ejecuten sin interrupción. Se gestiona a través del servicio del sistema PowerManager.
Los tipos principales son: PARTIAL_WAKE_LOCK (CPU activa, pantalla apagada) — recomendado; SCREEN_DIM_WAKE_LOCK (CPU + pantalla oscura); SCREEN_BRIGHT_WAKE_LOCK (CPU + pantalla brillante). SCREEN_DIM, SCREEN_BRIGHT y FULL_WAKE_LOCK están obsoletos y han sido reemplazados por FLAG_KEEP_SCREEN_ON.
Sí, es necesario declarar android.permission.WAKE_LOCK en el manifiesto. Este es un permiso normal que se concede automáticamente al instalar la aplicación — no es necesario solicitarlo en tiempo de ejecución. Sin este permiso, la llamada a newWakeLock() devolverá null o lanzará una SecurityException.
Si no se llama a release(), el dispositivo no puede entrar en modo de suspensión. La batería se agotará significativamente más rápido (hasta un 50% de consumo adicional). El sistema registrará la fuga en logcat, y Battery Historian mostrará un tiempo de retención anómalo de WakeLock, lo que provocará malas reseñas de los usuarios.
Para tareas largas, usa Foreground Service con una notificación — el propio sistema gestiona WakeLock. Para tareas diferidas y garantizadas, usa WorkManager, que admite WakeLock internamente. Para tareas cortas programadas, usa AlarmManager.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también