WakeLock: o que é, tipos e gestão do bloqueio de sono

Autor: IT Sectr Publicado: 2026-03-28 Tempo de leitura: 9 min

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 de sono que mantém o dispositivo ativo
  • Tipos — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK e outros
  • Permissão — WAKE_LOCK necessária no manifesto, mas não solicitada em tempo de execução
  • Riscos — um WakeLock não liberado esgota a bateria e prejudica a experiência do usuário
  • Alternativas — WorkManager, Foreground Service, JobScheduler reduzem a necessidade de WakeLock

O que é WakeLock

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.

Quando o WakeLock é necessário

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.

Como o WakeLock funciona

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.

WakeLock e eventos do sistema

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.

Tipos de WakeLock no Android

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.

TipoCPUTelaTecladoQuando usar
PARTIAL_WAKE_LOCKLigadoDesligadoDesligadoDownloads de arquivos, cálculos
SCREEN_DIM_WAKE_LOCKLigadoEscuraDesligadoPlayer de vídeo, apresentação
SCREEN_BRIGHT_WAKE_LOCKLigadoBrilhanteDesligadoJogos (obsoleto)
FULL_WAKE_LOCKLigadoBrilhanteBrilhanteObsoleto (deprecated)

PARTIAL_WAKE_LOCK — tipo principal

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.

Tipos obsoletos (deprecated)

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 e consumo de energia

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.

  • Battery Historian — ferramenta para analisar consumo de energia e vazamentos de WakeLock
  • Doze Mode — restringe WakeLock em janelas de manutenção, combinando bloqueios
  • Google Play Console — exibe estatísticas de WakeLock para aplicativos publicados
  • Lista negra — o aplicativo pode ser marcado pelo sistema como consumidor de energia

Melhores práticas de uso

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.

Regra de liberação

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.

Timeout na aquisição

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%.

Verificação do estado do bloqueio

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.

Usando WakeLock em Kotlin

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.

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() {
        // 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
}

Declaração de permissão no manifesto

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.

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

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

Alternativas ao WakeLock

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.

  • Foreground Service — gerenciamento automático de WakeLock com notificação
  • WorkManager — execução garantida com suporte a Doze e reinicialização
  • JobScheduler — agendamento com rede, carregamento e inatividade
  • AlarmManager — despertar o dispositivo para tarefas curtas agendadas

Perguntas frequentes

O que é WakeLock no Android

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.

Quais tipos de WakeLock existem

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.

É necessária permissão para WakeLock

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.

O que acontece se eu não liberar um WakeLock

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.

O que pode substituir o WakeLock em aplicativos modernos

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

  • WakeLock — um bloqueio de sono que mantém a CPU ou a tela de um dispositivo Android ativa
  • PARTIAL_WAKE_LOCK — o tipo principal para tarefas em segundo plano; a tela desliga, a CPU permanece ativa
  • Permissão — WAKE_LOCK no manifesto (permissão normal, sem necessidade de tempo de execução)
  • Vazamentos — um WakeLock não liberado esgota a bateria em 30–50%; liberar em finally ou via timeout
  • Obsoleto — SCREEN_DIM, SCREEN_BRIGHT e FULL_WAKE_LOCK substituídos por FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternativa com gerenciamento automático de WakeLock e notificação
  • WorkManager — a melhor escolha para tarefas em segundo plano adiadas com execução garantida

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.

Discutir o projeto

Leia também