WakeLock é um mecanismo do Android que impede o dispositivo de entrar no modo de suspensão, mantendo a CPU ou a tela ativa. Tarefas em segundo plano, como download de arquivos, reprodução de áudio ou gravação de dados, exigem WakeLock para execução garantida sem interrupções. De acordo com a especificação do Android Developers, 2025, o uso incorreto de WakeLock leva ao rápido esgotamento da bateria e pode causar o bloqueio do aplicativo no Google Play.
Pontos-chave
WakeLock é um bloqueio do sistema que impede o Android de colocar o dispositivo no modo de baixa energia. Normalmente, após alguns segundos de inatividade do usuário, o Android desliga a tela e coloca a CPU em estado de sono profundo (deep sleep), suspendendo as threads em segundo plano. O WakeLock impede essa transição mantendo a CPU ativa.
O mecanismo WakeLock é gerenciado através do serviço de sistema PowerManager, acessado pelo método getSystemService(Context.POWER_SERVICE). O desenvolvedor cria um objeto WakeLock, especificando o tipo de bloqueio, e deve liberá-lo garantidamente após a conclusão da tarefa, caso contrário a bateria do dispositivo se esgotará rapidamente. O sistema não libera o WakeLock automaticamente — é responsabilidade do aplicativo.
A cada grande lançamento do Android, o Google endurece o controle sobre o WakeLock. A partir do Android 9 (API 28), um aplicativo em segundo plano não pode adquirir WakeLock sem um motivo válido, e o sistema monitora aplicativos que abusam dos bloqueios e pode liberá-los à força. No Android 12+, foram introduzidas restrições adicionais ao acesso ao PowerManager para aplicativos em segundo plano.
O WakeLock é necessário em cenários onde uma tarefa não pode ser interrompida pela suspensão do dispositivo: download de um arquivo grande em conexão instável, gravação de vídeo, realização de cálculos longos sem interação do usuário. Sem um bloqueio de sono, a CPU entra em sono profundo, todas as threads congelam e a tarefa permanece incompleta.
No entanto, o Google recomenda fortemente minimizar o uso do WakeLock. Na maioria dos casos, a mesma tarefa pode ser resolvida com Foreground Service com notificação, WorkManager ou JobScheduler. Esses mecanismos consideram o estado da bateria e da rede, prolongando a vida útil da bateria do dispositivo.
O WakeLock funciona através do serviço de sistema PowerManager, que gerencia o estado de energia do dispositivo. Quando um aplicativo solicita um bloqueio via powerManager.newWakeLock(), o sistema aumenta o nível de atividade da CPU, evitando o sono profundo. Após chamar wakeLock.release(), o sistema retorna ao modo normal de economia de energia.
É importante entender que o WakeLock não impede todos os modos de economia de energia. O Doze Mode (modo de suspensão do Android 6+) pode ignorar o WakeLock em certas fases — um aplicativo com WakeLock retido não terá acesso à rede durante as janelas de manutenção do Doze. Isso significa que mesmo um WakeLock ativo não garante operações de rede durante a segunda fase do Doze.
Cada WakeLock está associado a um PowerManager.WakeLock no lado do framework. O sistema conta os bloqueios ativos no nível do processo: se um processo mantém vários WakeLocks, eles se acumulam e a liberação só ocorre após chamar release() para cada bloqueio. O Android também suporta timeouts de wake lock — liberação automática após um intervalo especificado. No entanto, confiar no timeout não é recomendado: a tarefa pode terminar mais cedo e o tempo extra de retenção reduzirá a duração da bateria.
Quando o dispositivo entra em modo de suspensão (botão liga/desliga), o Android libera à força todos os SCREEN_DIM_WAKE_LOCK e SCREEN_BRIGHT_WAKE_LOCK, mas mantém o PARTIAL_WAKE_LOCK. Isso significa que um bloqueio de tela não pode manter o display ligado — apenas o PARTIAL_WAKE_LOCK pode continuar funcionando após pressionar o botão liga/desliga.
O Android possui vários tipos de WakeLock, cada um controlando componentes específicos do dispositivo. A escolha do tipo determina quais componentes de hardware permanecem ativos após o bloqueio. Escolher o tipo errado leva ao consumo excessivo de energia devido à manutenção de módulos desnecessários ligados.
| Tipo | CPU | Tela | Teclado | Quando usar |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Ligado | Desligado | Desligado | Downloads de arquivos, cálculos |
| SCREEN_DIM_WAKE_LOCK | Ligado | Escura | Desligado | Player de vídeo, apresentação |
| SCREEN_BRIGHT_WAKE_LOCK | Ligado | Brilhante | Desligado | Jogos (obsoleto) |
| FULL_WAKE_LOCK | Ligado | Brilhante | Brilhante | Obsoleto (deprecated) |
PARTIAL_WAKE_LOCK é o tipo mais usado e recomendado. Ele mantém a CPU ativa, mas permite que a tela e a retroiluminação do teclado desliguem. Esta é a escolha ideal para tarefas em segundo plano: carregamento de dados, processamento de imagens, sincronização. A tela apaga após o timeout do sistema, economizando bateria enquanto realiza trabalho invisível ao usuário.
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK e FULL_WAKE_LOCK estão obsoletos desde o Android 7 (API 24). Eles mantêm a tela ligada, causando consumo significativo de bateria. O Google recomenda usar FLAG_KEEP_SCREEN_ON através de Activity.getWindow().addFlags() em vez disso — esta flag só funciona quando a Activity está ativa e não requer a permissão WAKE_LOCK, enquanto o sistema gerencia automaticamente o tempo de retenção da tela.
WakeLock é um dos principais consumidores de bateria no Android. Cada segundo de retenção de um bloqueio de sono consome energia extra porque a CPU não pode transitar para um estado C de baixo consumo. A pesquisa do Google Power Dashboard mostra que aplicativos com WakeLocks liberados incorretamente podem aumentar o consumo de energia do dispositivo em 30–50% no modo de espera.
O sistema rastreia aplicativos que abusam do WakeLock através do componente Battery Historian. O desenvolvedor pode analisar o perfil de consumo de energia e identificar vazamentos de bloqueios — situações em que um WakeLock foi criado mas não liberado. O Google Play Console mostra estatísticas de WakeLock para aplicativos publicados, e o alto tempo de retenção pode levar a avaliações ruins.
O Doze Mode e o App Standby restringem ainda mais a operação do WakeLock. Na primeira fase do Doze (Light Doze), o sistema permite WakeLock em janelas de manutenção curtas. Na segunda fase (Deep Doze), o WakeLock é combinado com outros bloqueios e executado em uma janela comum. Se um aplicativo mantiver um WakeLock por mais de 10 minutos sem interação do usuário, o sistema pode liberá-lo à força e adicionar o aplicativo à lista negra de otimização da bateria.
O uso correto do WakeLock é um equilíbrio entre a necessidade de concluir uma tarefa e o cuidado com a bateria do dispositivo. O Google recomenda seguir vários princípios: sempre liberar o WakeLock em um bloco finally ou através de acquire(timeout), usar o tipo de bloqueio mínimo necessário e evitar retenções prolongadas sem extrema necessidade.
O WakeLock deve ser liberado no mesmo bloco de código onde foi criado. Para garantir a liberação em caso de exceções, usa-se a construção try-finally ou o bloco use do Kotlin. No Android 10+, o sistema mostra um aviso no logcat se um WakeLock for mantido por mais de 60 segundos: "WakeLock held for more than 60 seconds" — isso sinaliza um possível vazamento.
O método acquire(long timeout) libera automaticamente o WakeLock após o tempo especificado em milissegundos. Isso é uma salvaguarda caso o código de liberação não execute devido a uma exceção ou bug. Recomenda-se sempre especificar um timeout igual ao tempo máximo esperado de execução da tarefa mais uma margem de 10–20%.
Antes de chamar release(), deve-se verificar se o WakeLock está atualmente retido. Chamar release() novamente sem um acquire() prévio causa um RuntimeException: WakeLock under-locked. Recomenda-se armazenar uma flag de estado (isHeld) e verificar wakeLock.isHeld() antes de liberar.
Vejamos a criação e liberação corretas do WakeLock em Kotlin. O exemplo demonstra o carregamento assíncrono de dados com retenção de PARTIAL_WAKE_LOCK, liberação garantida em um bloco try-finally e um timeout especificado como salvaguarda contra vazamentos. O serviço usa CoroutineScope com o dispatcher IO para execução de tarefas em 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 download de arquivo
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Para usar o WakeLock, é necessário adicionar a permissão no AndroidManifest.xml. A permissão WAKE_LOCK é uma permissão normal — não requer solicitação em tempo de execução ao usuário e é concedida automaticamente na instalação do aplicativo. No entanto, o Google Play pode rejeitar a publicação se o aplicativo não tiver um caso de uso óbvio para WakeLock.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
O WakeLock é um mecanismo de baixo nível, e o Google recomenda substituí-lo por APIs mais modernas sempre que possível. A principal alternativa é o Foreground Service com uma notificação, que mantém automaticamente o bloqueio da CPU durante a duração do serviço. O próprio sistema gerencia o WakeLock para o Foreground Service, liberando o desenvolvedor da aquisição e liberação explícitas.
O WorkManager é a segunda ferramenta mais importante para tarefas em segundo plano. Ele garante a execução da tarefa mesmo quando o dispositivo entra no modo Doze e após a reinicialização. O WorkManager suporta um bloqueio interno (hold lock) — o desenvolvedor não precisa trabalhar explicitamente com o PowerManager. A tarefa é executada na janela de manutenção do Doze com gerenciamento automático do bloqueio de sono.
Para tarefas recorrentes que exigem tempo preciso, usa-se o AlarmManager com setAndAllowWhileIdle(), que pode acordar o dispositivo do Doze. No entanto, o AlarmManager só é adequado para operações curtas — ele não foi projetado para retenção prolongada de WakeLock. Se uma tarefa demorar mais de 10 segundos, combine o AlarmManager com um BroadcastReceiver que inicia um Foreground Service.
Perguntas frequentes
WakeLock é um bloqueio do sistema que impede um dispositivo Android de entrar no modo de suspensão. Ele mantém a CPU ou a tela ativa, permitindo que tarefas em segundo plano (downloads, cálculos) sejam executadas sem interrupção. É gerenciado através do serviço de sistema PowerManager.
Os principais tipos são: PARTIAL_WAKE_LOCK (CPU ativa, tela desligada) — recomendado; SCREEN_DIM_WAKE_LOCK (CPU + tela escura); SCREEN_BRIGHT_WAKE_LOCK (CPU + tela brilhante). SCREEN_DIM, SCREEN_BRIGHT e FULL_WAKE_LOCK estão obsoletos e foram substituídos por FLAG_KEEP_SCREEN_ON.
Sim, é necessário declarar android.permission.WAKE_LOCK no manifesto. Esta é uma permissão normal que é concedida automaticamente na instalação — não é necessário solicitá-la em tempo de execução. Sem esta permissão, a chamada newWakeLock() retornará null ou lançará uma SecurityException.
Se release() não for chamado, o dispositivo não pode entrar no modo de suspensão. A bateria será drenada significativamente mais rápido (até 50% de consumo extra). O sistema registrará o vazamento no logcat, e o Battery Historian mostrará um tempo de retenção anormal de WakeLock, levando a avaliações ruins dos usuários.
Para tarefas longas, use Foreground Service com uma notificação — o próprio sistema gerencia o WakeLock. Para tarefas adiadas e garantidas, use WorkManager, que suporta WakeLock internamente. Para tarefas curtas agendadas, use AlarmManager.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também