Doze Mode é um recurso de economia de energia do Android, introduzido na versão 6.0 Marshmallow, que restringe significativamente a atividade em segundo plano dos aplicativos quando o dispositivo está ocioso. O sistema coloca os aplicativos em um estado de consumo reduzido de energia, adiando solicitações de rede, sincronização e JobScheduler para prolongar a vida útil da bateria. De acordo com uma análise do Android Developers, 2025, o Doze Mode pode aumentar o tempo de espera do dispositivo em 2–3 vezes, dependendo do modelo e da versão do SO.
Principais conclusões
Doze Mode é um mecanismo integrado de economia de energia do Android que é ativado quando o dispositivo não está conectado a um carregador, a tela está desligada e o usuário não interagiu com o dispositivo por um determinado período. O objetivo do Doze é minimizar a atividade em segundo plano dos aplicativos para maximizar a duração da bateria em modo de espera. O sistema adia JobScheduler, sincronização de contas, AlarmManager e solicitações de rede.
O modo foi introduzido no Android 6.0 Marshmallow (API 23) e foi significativamente aprimorado nas versões subsequentes. O Android 7.0 Nougat introduziu uma segunda fase (Light Doze) que é ativada quando o dispositivo está em movimento. O Android 8.0 adicionou restrições adicionais aos serviços em segundo plano que trabalham em conjunto com o Doze. No Android 12+, o Doze foi integrado a um sistema de gerenciamento de bateria atualizado que analisa o comportamento do usuário.
É importante entender: o Doze Mode não desativa completamente os aplicativos. Ele os coloca em um estado com tarefas adiadas, mas não mata processos. Um Foreground Service com notificação continua funcionando, notificações push de alta prioridade (FCM high-priority) são entregues e alarmes disparam conforme agendado. O Doze afeta apenas operações em segundo plano que o usuário não vê ou espera naquele momento.
Doze Mode é ativado quando todas as condições são atendidas: tela desligada por mais de 30 minutos (primeira ativação), dispositivo imóvel (usando o acelerômetro) e não conectado a um carregador. Se o usuário pegar o telefone ou conectar um carregador, o Doze é imediatamente desativado. No Android 7+, o Light Doze é ativado após apenas 5 minutos de inatividade, mesmo quando o dispositivo está em movimento.
Doze Mode gerencia a atividade em segundo plano através do serviço de sistema DeviceIdleController, que analisa o estado dos sensores, da tela e do carregador. Quando todas as condições de ativação são atendidas, o sistema coloca os aplicativos em modo de espera, agrupando suas solicitações em janelas de manutenção. Dentro dessas janelas, todas as tarefas adiadas — chamadas de rede, sincronização, AlarmManager — são executadas em lote.
O PowerManager do sistema controla quais aplicativos podem sair do Doze. Notificações push de alta prioridade (FCM high-priority) podem despertar o dispositivo para entregar uma mensagem. O sistema também ignora o Doze para aplicativos adicionados pelo usuário à lista de permissão de otimização da bateria. Todos os outros aplicativos devem aguardar a próxima janela de manutenção.
A duração das janelas de manutenção no Deep Doze aumenta exponencialmente: primeira janela após 1 hora, segunda após 2 horas, terceira após 4 horas e assim por diante até um intervalo máximo de 12 horas. Isso significa que quanto mais tempo o dispositivo permanece no Doze, menos frequentemente os aplicativos podem executar tarefas em segundo plano — economizando bateria da forma mais agressiva possível.
No Doze Mode, todas as solicitações de rede são suspensas até a abertura de uma janela de manutenção. As únicas exceções são mensagens FCM de alta prioridade (com a tag “high_priority” no payload) e sinais do AlarmManager com os flags setAndAllowWhileIdle() ou setExactAndAllowWhileIdle(). Chamadas de rede comuns via Retrofit, OkHttp ou Volley não serão executadas até que uma janela abra.
Doze Mode consiste em duas fases: Light Doze (sono leve) e Deep Doze (sono profundo). Cada fase impõe suas próprias restrições e tem diferentes limiares de ativação. Entender a diferença entre as fases é crítico para um desenvolvedor que projeta tarefas em segundo plano resilientes ao modo de economia de energia.
Light Doze é ativado após 5–30 minutos de inatividade do dispositivo (tela desligada, sem movimento). Nesta fase, as solicitações de rede e a sincronização são suspensas, mas o AlarmManager e o JobScheduler continuam funcionando com pequenos atrasos. Os aplicativos podem sair do Light Doze ao receber uma notificação push ou ao conectar a um carregador. O Light Doze não exige imobilidade total — o dispositivo pode estar em movimento.
Deep Doze ocorre após 60–90 minutos de inatividade com o dispositivo imóvel (acelerômetro não detecta movimento). No Deep Doze, o sistema é significativamente mais agressivo em adiar tarefas: as janelas de manutenção abrem com menos frequência (com intervalo crescente exponencialmente), o AlarmManager só dispara com os flags setAndAllowWhileIdle() e o WakeLock não funciona da maneira usual. Os aplicativos que não estão na lista de permissão são quase completamente privados de atividade em segundo plano.
| Parâmetro | Light Doze | Deep Doze |
|---|---|---|
| Tempo de ativação | 5–30 minutos | 60–90 minutos |
| Exigência de movimento | Não exigido | Imobilidade |
| Intervalo das janelas | 10–60 minutos | 1–12 horas |
| AlarmManager | Funciona com atrasos | Apenas withAllowWhileIdle |
| Rede nas janelas | Disponível | Disponível |
Doze Mode impõe várias categorias de restrições que um desenvolvedor deve considerar ao projetar um aplicativo. Ignorar essas restrições faz com que as tarefas em segundo plano não sejam executadas e o usuário veja um comportamento incorreto do aplicativo — atualizações ausentes, mensagens não enviadas, sincronização incompleta.
Todas as solicitações de rede são bloqueadas até a abertura de uma janela de manutenção. Isso se aplica a chamadas HTTP, conexões WebSocket e downloads de arquivos. A exceção são as mensagens FCM de alta prioridade, que passam por um canal separado do Google Play Services independente do Doze. Para sincronização de dados críticos, é recomendado usar o WorkManager com a política NetworkType.CONNECTED.
AlarmManager no Deep Doze adia todos os alarmes, exceto os criados com os métodos setAndAllowWhileIdle() e setExactAndAllowWhileIdle(). No entanto, mesmo esses métodos têm uma limitação — não mais de 1 disparo a cada 9 minutos por aplicativo. Alarmes exatos com setExact() no Deep Doze não garantem disparo no horário especificado.
WakeLock se comporta de forma incomum no Doze Mode: o sistema não mantém o bloqueio de ativação para aplicativos fora da lista de permissão. Mesmo que um aplicativo tenha adquirido corretamente um PARTIAL_WAKE_LOCK, quando o Deep Doze começa, o sistema pode liberá-lo à força. A única maneira de garantir a execução de tarefas no Doze é usar um Foreground Service com uma notificação.
A lista de permissão do Doze é uma lista de aplicativos aos quais o sistema permite atividade em segundo plano no modo de economia de energia com restrições mínimas. O usuário pode adicionar manualmente aplicativos à lista através de Configurações → Bateria → Otimização da bateria. Aplicativos do sistema, inicializadores e Google Play Services estão na lista de permissão por padrão.
Um desenvolvedor pode solicitar a inclusão na lista de permissão através de um diálogo do sistema com a Intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Para isso, é necessária a permissão REQUEST_IGNORE_BATTERY_OPTIMIZATIONS no manifesto. No entanto, o Google não recomenda solicitar uma exceção sem um motivo válido — aplicativos que abusam desse recurso correm o risco de serem rejeitados ao serem publicados no Google Play.
Sem a lista de permissão, um aplicativo pode usar FCM de alta prioridade para despertar o dispositivo do Doze. Cada uma dessas mensagens dá ao aplicativo uma janela curta (10–30 segundos) para executar uma tarefa. Para operações mais longas, o aplicativo deve iniciar um Foreground Service, que continua funcionando dentro das janelas de manutenção do Doze. O Google também fornece um mecanismo de isenção para certos tipos de aplicativos: navegação, médicos, mensageiros.
Para verificar se um aplicativo está na lista de permissão de otimização da bateria, use o método powerManager.isIgnoringBatteryOptimizations(). Se o método retornar false, o aplicativo está sujeito a todas as restrições do Doze. Se retornar true, o aplicativo pode usar Wakelock, AlarmManager e rede sem restrições mesmo no Deep Doze. No entanto, abusar desse privilégio resultará em más avaliações dos usuários.
Testar o comportamento do aplicativo no Doze Mode é uma etapa obrigatória do desenvolvimento, pois o Doze pode interromper as funções em segundo plano. O Android fornece ferramentas de linha de comando via ADB para forçar a transição do dispositivo para Light Doze e Deep Doze. Os testes devem ser realizados em um dispositivo físico ou emulador com Android 6.0+.
Para entrar no Light Doze, use o comando adb shell dumpsys deviceidle step light. Para Deep Doze — adb shell dumpsys deviceidle step deep. O comando adb shell dumpsys deviceidle force-idle deep faz a transição imediata do dispositivo para Deep Doze sem aguardar o timeout padrão. Após os testes, saia do Doze com o comando adb shell dumpsys deviceidle unforce.
# Forçar entrada no Light Doze
$ adb shell dumpsys deviceidle step light
# Forçar entrada no Deep Doze
$ adb shell dumpsys deviceidle step deep
# Forçar Deep Doze imediatamente
$ adb shell dumpsys deviceidle force-idle deep
# Sair do Doze
$ adb shell dumpsys deviceidle unforce
# Verificar status do Doze
$ adb shell dumpsys deviceidle
Após a transição para o Doze Mode, verifique: se as solicitações de rede funcionam (devem estar adiadas), se o AlarmManager dispara, se as mensagens FCM são entregues e se as tarefas do WorkManager executam corretamente. O WorkManager continua funcionando no Doze: suas tarefas são executadas nas janelas de manutenção. No entanto, se uma tarefa exigir execução imediata, especifique setExpedited() ou use um Foreground Service.
Desenvolver um aplicativo resiliente ao Doze Mode requer repensar a abordagem para tarefas em segundo plano. O Google recomenda projetar o aplicativo para funcionar corretamente sob quaisquer restrições do Doze, sem depender da execução imediata de operações em segundo plano. O princípio fundamental é usar o WorkManager para todas as tarefas em segundo plano que podem ser adiadas.
WorkManager é a API recomendada pelo Google para tarefas em segundo plano porque se adapta automaticamente ao Doze. O WorkManager usa JobScheduler (API 23+) ou AlarmManager + BroadcastReceiver em versões mais antigas. As tarefas do WorkManager executam na janela de manutenção mais próxima do Doze, ou imediatamente se necessário através do Expedited Work (Foreground Service sob o capô).
Se uma tarefa não puder ser adiada (reprodução de mídia, navegação, VoIP), use um Foreground Service com uma notificação obrigatória. Um Foreground Service recebe uma isenção do Doze: ele pode manter um WakeLock e executar solicitações de rede. No entanto, mesmo um Foreground Service está sujeito às políticas de janelas de manutenção do Deep Doze para alguns tipos de tarefas — por exemplo, dataSync.
Para entregar mensagens que exigem atenção imediata (chamada recebida, notificação urgente), use mensagens FCM de alta prioridade. Essas mensagens despertam o dispositivo do Doze e dão ao aplicativo uma janela curta para processamento. Não use alta prioridade para notificações regulares — isso causará drenagem rápida da bateria e pode ser considerado uma violação da política do Google Play.
Perguntas frequentes
Doze Mode é um modo de economia de energia do Android 6+ que restringe a atividade em segundo plano dos aplicativos quando o dispositivo não está em uso (tela desligada, sem movimento). O sistema adia solicitações de rede, sincronização e JobScheduler, agrupando-os em janelas de manutenção para economizar bateria.
Doze Mode tem duas fases: Light Doze (sono leve) é ativado após 5–30 minutos e permite que o AlarmManager funcione com atrasos. Deep Doze (sono profundo) ocorre após 60–90 minutos de imobilidade, restringindo agressivamente tarefas em segundo plano com janelas de manutenção de até 12 horas.
Doze bloqueia solicitações de rede, adia o AlarmManager (exceto setAndAllowWhileIdle), libera à força o WakeLock e agrupa o JobScheduler em janelas de manutenção. As exceções incluem Foreground Service, FCM de alta prioridade e aplicativos na lista de permissão do usuário.
Solicite a permissão REQUEST_IGNORE_BATTERY_OPTIMIZATIONS no manifesto e envie uma Intent com a ação ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. O sistema mostrará um diálogo ao usuário. Adicionar à lista de permissão é um privilégio que o Google recomenda usar apenas para aplicativos criticamente importantes.
Use comandos ADB: adb shell dumpsys deviceidle force-idle deep para entrar no Deep Doze, adb shell dumpsys deviceidle step light para Light Doze, adb shell dumpsys deviceidle unforce para sair. Verifique WorkManager, AlarmManager e FCM em cada modo.
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