O Android tem dois recursos de economia de energia que prolongam a duração da bateria para os usuários, gerenciando como os apps se comportam quando um dispositivo não está conectado a uma fonte de energia: Soneca e App em espera. O modo Soneca reduz o consumo de bateria adiando a atividade da CPU e da rede em segundo plano para apps quando o dispositivo não é usado por longos períodos. O App em espera adia a atividade da rede em segundo plano para apps sem atividade recente do usuário.
Enquanto o dispositivo está no modo Soneca, o acesso dos apps a determinados recursos que consomem muita bateria é adiado até a janela de manutenção. Restrições específicas estão listadas em Restrições do gerenciamento de energia.
O Soneca e o App em espera gerenciam o comportamento de todos os apps em execução no Android 6.0 ou mais recente, independentemente de serem direcionados especificamente ao nível desejado da API. Para garantir a melhor experiência aos usuários, teste o app nos modos Soneca e App em espera e faça os ajustes necessários no código. As seções a seguir dão detalhes.
Noções básicas sobre o modo Doze
Se um usuário deixar um dispositivo desconectado e parado por um período, com a tela desligada, o dispositivo entrará no modo Soneca. No modo Soneca, o sistema tenta economizar bateria restringindo o acesso dos apps à rede e aos serviços que consomem muita CPU. Ele também impede que os apps acessem a rede e adia os jobs, as sincronizações e os alarmes padrão.
Periodicamente, o sistema sai do modo Soneca por um breve período para permitir que os apps concluam as atividades adiadas. Durante essa janela de manutenção, o sistema executa todas as sincronizações, jobs e alarmes pendentes e permite que os apps acessem a rede.
Quando a janela de manutenção é concluída, o sistema entra novamente no modo de Soneca, suspendendo o acesso à rede e adiando jobs, sincronizações e alarmes. Com o tempo, o sistema programa janelas de manutenção com menos frequência, o que ajuda a reduzir o consumo de bateria em casos de inatividade mais longa quando o dispositivo não está carregando.
Quando o usuário ativa o dispositivo movendo-o, ligando a tela ou conectando um carregador, o sistema sai do modo Soneca e todos os apps retomam a atividade normal.
Restrições do recurso Soneca
O sistema aplica as seguintes restrições aos apps enquanto eles estão no modo Soneca:
- Suspende o acesso à rede.
- Ignora wake locks.
- Adia os alarmes padrão
AlarmManager, incluindosetExact()esetWindow(), para a próxima janela de manutenção.- Se você precisar definir alarmes que são acionados durante o modo Soneca, use
setAndAllowWhileIdle()ousetExactAndAllowWhileIdle(). - Os alarmes definidos com
setAlarmClock()continuam sendo acionados normalmente. O sistema sai do modo soneca pouco antes de esses alarmes serem acionados.
- Se você precisar definir alarmes que são acionados durante o modo Soneca, use
- Não realiza buscas por Wi-Fi.
- Não permite que os adaptadores de sincronização sejam executados.
- Não permite que o
JobSchedulerseja executado.
Lista de verificação do Soneca
- Se possível, use o Firebase Cloud Messaging (FCM) para mensagens downstream.
- Se os usuários precisarem ver uma notificação imediatamente, use o tipo de mensagem
RemoteNotification. Para mais orientações, consulte a documentação do FCM sobre o tipo de mensagemRemoteNotification. - Forneça informações suficientes no payload da mensagem inicial para que o acesso subsequente à rede seja desnecessário.
- Defina alarmes críticos com
setAndAllowWhileIdle()esetExactAndAllowWhileIdle(). - Teste o app no modo Soneca.
Adaptar seu app ao recurso Soneca
O modo Doze pode afetar os apps de maneira diferente, dependendo dos recursos que eles oferecem e dos serviços que usam. Muitos apps funcionam normalmente nos ciclos do modo Soneca sem modificações. Em alguns casos, é necessário otimizar a maneira como o app gerencia a rede, os alarmes, os jobs e as sincronizações. Os apps precisam ser capazes de gerenciar atividades de maneira eficiente durante cada janela de manutenção.
Para ajudar a programar alarmes, use dois métodos
AlarmManager: setAndAllowWhileIdle() e
setExactAndAllowWhileIdle(). Com esses métodos, é possível definir alarmes
que são acionados mesmo se o dispositivo estiver no modo Soneca.
A restrição do modo Soneca ao acesso à rede também pode afetar seu app, especialmente se ele depende de mensagens em tempo real, como tickles ou notificações. Se o app exigir uma conexão persistente com a rede para receber mensagens, use o Firebase Cloud Messaging (FCM), se possível.
Para confirmar que o app se comporta como esperado com o modo Soneca, use
comandos adb para forçar o sistema a entrar e sair do modo Soneca e
observar o comportamento do app. Para mais detalhes, consulte
Testes com os recursos Soneca e App em espera.
Entender o modo App em espera
O App em espera permite que o sistema determine que um app está inativo quando o usuário não o está usando ativamente. O sistema faz essa determinação quando o usuário não toca no app por um determinado período e nenhuma das seguintes condições se aplica:
- O usuário inicia o app explicitamente.
- O app tem um processo em primeiro plano, seja como uma atividade ou um serviço em primeiro plano, ou em uso por outra atividade ou serviço em primeiro plano.
- O app gera uma notificação que os usuários veem na tela de bloqueio ou na bandeja de notificações.
Quando o usuário conecta o dispositivo a uma fonte de alimentação, o sistema libera os apps do estado de espera, permitindo que eles acessem livremente a rede e executem todos os jobs e sincronizações pendentes. Se o dispositivo ficar ocioso por longos períodos, o sistema vai permitir que os apps ociosos acessem a rede cerca de uma vez por dia.
Usar o FCM para interagir com o app enquanto o dispositivo está inativo
O Firebase Cloud Messaging (FCM) é um serviço de nuvem para dispositivo que permite o envio de mensagens downstream em tempo real entre serviços de back-end e apps em dispositivos Android. O FCM oferece uma conexão única e persistente com a nuvem. Todos os apps que precisam de mensagens em tempo real podem compartilhar essa conexão. Essa conexão compartilhada otimiza significativamente o consumo de bateria, tornando desnecessário que vários apps mantenham as próprias conexões persistentes separadas, o que pode esgotar a bateria rapidamente. Por esse motivo, se o app exigir integração de mensagens com um serviço de back-end, recomendamos que você use o FCM, se possível, em vez de manter sua própria conexão de rede persistente.
O FCM é otimizado para funcionar com os modos de inatividade Soneca e App em Espera. O tipo de mensagem RemoteNotification do FCM permite que você ative o app para interagir com o usuário. No
modo de espera ou soneca, o sistema entrega a mensagem e concede ao app
acesso temporário aos serviços de rede e wakelocks parciais. Em seguida, ele retorna o
dispositivo ou app ao estado inativo. Para notificações urgentes e visíveis ao usuário,
use os tipos de mensagem RemoteNotification para permitir a entrega no modo
Soneca. Essas mensagens podem resultar em notificações. Consulte
as
orientações do FCM sobre RemoteNotification para mais informações.
Para mensagens que não resultam em notificações, como manter o conteúdo do app
atualizado em segundo plano ou iniciar sincronizações de dados, use mensagens do FCM
BackgroundSync. Essas mensagens têm baixa prioridade intencionalmente e podem ser atrasadas ou
limitadas para otimizar a bateria do dispositivo.
Como prática recomendada geral, se o app exigir mensagens downstream, use o FCM. Se o app já usa o FCM, verifique se ele usa RemoteNotification
para mensagens que resultam em notificações voltadas ao usuário.
Não use RemoteNotification nas seguintes situações:
- Quando uma notificação definitivamente não será mostrada.
- Para entrega imediata de mensagens que apenas atualizam o estado do app, como manter o conteúdo do app atualizado em segundo plano ou iniciar sincronizações de dados.
- Como um meio de solicitar que o usuário final conceda permissões.
Compatibilidade com outros casos de uso
Quase todos os apps podem oferecer suporte ao modo Doze gerenciando a conectividade de rede, os alarmes, os jobs e as sincronizações, além de usar mensagens do FCM. Para um conjunto restrito de casos de uso, isso pode ser insuficiente. Para esses casos, o sistema fornece uma lista configurável de apps que são parcialmente isentos das otimizações do modo Soneca e do App em espera.
Um app parcialmente isento pode usar a rede e manter wake locks
parciais durante os modos Soneca e App em Espera. No entanto, outras restrições ainda se aplicam
ao app, assim como a outros apps. Por exemplo, os jobs e as sincronizações do app
são adiados no nível 23 da API e anteriores, e os alarmes
AlarmManager regulares não são acionados. Um app pode verificar se está
na lista de isenção chamando
isIgnoringBatteryOptimizations().
Os usuários podem configurar manualmente a lista de apps isentos em Configurações > Bateria > Otimização da bateria. Como alternativa, o sistema oferece maneiras de os apps pedirem aos usuários para serem isentos:
- A maioria dos apps pode invocar uma intent que contenha
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Os apps que atendem a um caso de uso aceitável
podem invocar uma intent que contenha a
ação de intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSpara permitir que o usuário adicione o app à lista de isenção diretamente, sem acessar as configurações do sistema.
Um app pode verificar se está na lista de isenção chamando
isIgnoringBatteryOptimizations().
Testar com os recursos Soneca e App em espera
Para garantir uma ótima experiência aos usuários, teste o app totalmente nos modos Soneca e App em Espera.
Testar seu app com o modo Soneca
Para testar o modo Soneca, faça o seguinte:
- Configure um dispositivo de hardware ou dispositivo virtual com uma imagem do sistema do Android 6.0 (nível 23 da API) ou mais recente.
- Conecte o dispositivo à máquina de desenvolvimento e instale o app.
- Execute o app e deixe-o ativo.
- Force o sistema a entrar no modo ocioso executando o seguinte comando:
$ adb shell dumpsys deviceidle force-idle - Quando estiver pronto, saia do modo ocioso executando o seguinte comando:
$ adb shell dumpsys deviceidle unforce - Reative o dispositivo executando o seguinte comando:
$ adb shell dumpsys battery reset - Observe o comportamento do seu app depois de reativar o dispositivo. Verifique se o app se recupera normalmente quando o dispositivo sai do modo Soneca.
Testar o app com o modo App em espera
Para testar o modo App em espera com seu app, faça o seguinte:
- Configure um dispositivo de hardware ou dispositivo virtual com uma imagem do sistema do Android 6.0 (nível 23 da API) ou mais recente.
- Conecte o dispositivo à máquina de desenvolvimento e instale o app.
- Execute o app e deixe-o ativo.
- Force o app a entrar no modo de espera executando os seguintes comandos:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true - Simule o despertar do seu app usando os seguintes comandos:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName> - Observe o comportamento do seu app depois de despertá-lo. Verifique se o app se recupera normalmente do modo de espera. Em especial, verifique se as notificações e os jobs em segundo plano do app funcionam conforme o esperado.
Casos de uso aceitáveis para isenção
A tabela a seguir destaca vários casos de uso e se é aceitável
que os apps usem a ação de intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS nessas situações. Em geral, seu app não atende a essas
exceções, a menos que o modo Soneca ou o App em espera interrompa a função principal do app ou
haja um motivo técnico para que ele não possa usar mensagens do FCM
RemoteNotification.
Para mais informações, consulte Suporte para outros casos de uso.
| Tipo | Caso de uso | Pode usar o FCM? | A isenção é aceitável? | Observações |
|---|---|---|---|---|
| Mensagens instantâneas, bate-papo ou app de chamada. | Exige o envio de mensagens em tempo real aos usuários enquanto o dispositivo está no modo Doze ou o app está no modo App em espera. | Sim, usando o FCM. | Não aceitável | Use as mensagens RemoteNotification do FCM para ativar o app e acessar
a rede. |
Sim, mas não está usando mensagens RemoteNotification do FCM. |
||||
| Mensagens instantâneas, bate-papo ou app de ligação; apps empresariais de VOIP. | Não, não é possível usar o FCM devido à dependência técnica de outro serviço de mensagens ou porque o modo de soneca e o app em espera interrompem a função principal do app. | Aceitável | ||
| App Emergência pessoal. | Apps que protegem os usuários e as famílias deles. | Se aplicável. | Aceitável | |
| App de automação de tarefas. | A função principal do app é programar ações automatizadas, como mensagens instantâneas, ligações ou gerenciamento de novas fotos. | Se aplicável. | Aceitável | |
| App complementar de dispositivo periférico. | A função principal do app é manter uma conexão persistente com o dispositivo periférico para fornecer acesso à Internet a ele. | Se aplicável. | Aceitável | |
| O app só precisa se conectar a um dispositivo periférico periodicamente para sincronizar ou só precisa se conectar a dispositivos, como fones de ouvido sem fio, conectados por perfis Bluetooth padrão. | Se aplicável. | Não aceitável |