O Android tem dois recursos de economia de energia que prolongam a duração da bateria para os usuários, gerenciando o comportamento dos apps quando um dispositivo não está conectado a uma fonte de energia: Soneca e App em espera. O recurso Soneca reduz o consumo da bateria adiando a CPU em segundo plano e a atividade de rede para apps quando o dispositivo não for usado por longos períodos. O App em espera adia a atividade de rede em segundo plano para apps sem atividade recente do usuário.
Enquanto o dispositivo está no modo Soneca, o acesso de apps a determinados recursos de uso intensivo da bateria é adiado até a janela de manutenção. Restrições específicas estão listadas em Restrições do gerenciamento de energia.
Os recursos "Soneca" e "App em espera" gerenciam o comportamento de todos os apps executados no Android 6.0 ou versões mais recentes, sejam eles direcionados especificamente ao nível 23 da API. Para ajudar a garantir a melhor experiência para os usuários, teste seu app nos modos Soneca e App em espera e faça os ajustes necessários no código. As seções a seguir fornecem detalhes.
Entender o recurso Soneca
Se um usuário deixa um dispositivo desconectado e parado por um período de tempo, com a tela desligada, o dispositivo entra no modo Soneca. No modo Soneca, o sistema tenta economizar bateria restringindo o acesso de apps à rede e a serviços com uso intensivo da CPU. Ele também impede que os apps acessem a rede e adia os jobs, sincronizações e alarmes padrão.
Periodicamente, o sistema sai do Soneca por um breve período para permitir que os apps concluam as atividades adiadas. Durante essa janela de manutenção, o sistema executa todos os trabalhos, alarmes e sincronizações pendentes e permite que os apps acessem a rede.
Quando a janela de manutenção é concluída, o sistema entra novamente no modo 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, ajudando a reduzir o consumo da 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 Soneca e todos os apps retomam a atividade normal.
Restrições do recurso Soneca
O sistema aplica as seguintes restrições aos apps durante o modo Soneca:
- Suspende o acesso à rede.
- Ignora wake locks.
- Adia alarmes
AlarmManager
padrão, incluindosetExact()
esetWindow()
, para a próxima janela de manutenção.- Se você precisar definir alarmes que disparam durante o modo Soneca, use
setAndAllowWhileIdle()
ousetExactAndAllowWhileIdle()
. - Alarmes definidos com
setAlarmClock()
continuam a disparar normalmente. O sistema sai do modo Soneca pouco antes desses alarmes dispararem.
- Se você precisar definir alarmes que disparam durante o modo Soneca, use
- Não realiza buscas por Wi-Fi.
- Não permite a execução de adaptadores de sincronização.
- Não permite que o
JobScheduler
seja executado.
Lista de verificação do Soneca
- Se possível, use o Firebase Cloud Messaging (FCM) para mensagens downstream.
- Se seus usuários precisarem ver uma notificação imediatamente, use uma mensagem de alta prioridade do FCM. Use a prioridade alta somente para mensagens que resultem em uma notificação. Para mais orientações, consulte a documentação do FCM sobre prioridade de mensagens para Android.
- Forneça informações suficientes dentro do payload da mensagem inicial para que o acesso subsequente à rede não seja necessário.
- Defina alarmes críticos com
setAndAllowWhileIdle()
esetExactAndAllowWhileIdle()
. - Teste seu app no modo Soneca.
Adaptar seu app ao recurso Soneca
O Soneca pode afetar apps de forma diferente, dependendo dos recursos que eles oferecem e dos serviços que usam. Muitos apps funcionam normalmente durante os ciclos de Soneca sem modificações. Em alguns casos, você precisa otimizar a maneira como seu app gerencia rede, alarmes, trabalhos e sincronizações. Os apps precisam ser capazes de gerenciar as atividades de forma eficiente durante cada janela de manutenção.
Para ajudar na programação de alarmes, use dois métodos
AlarmManager
: setAndAllowWhileIdle()
e
setExactAndAllowWhileIdle()
. Com esses métodos, você pode definir alarmes
que disparam mesmo se o dispositivo estiver no modo Soneca.
A restrição do "Soneca" sobre o acesso à rede provavelmente também afetará seu app, especialmente se ele depender de mensagens em tempo real, como convites 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 seu app se comporta como esperado com o "Soneca", você pode usar
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 App em espera
O App em espera permite que o sistema determine se um app está inativo quando o usuário não está em uso. O sistema determina isso quando o usuário não toca no app por um determinado período e nenhuma das condições abaixo se aplica:
- O usuário inicia o aplicativo explicitamente.
- O app tem um processo atualmente em primeiro plano, seja como uma atividade ou serviço de primeiro plano, ou que esteja em uso por outra atividade ou serviço de 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 apps do estado de espera, permitindo que acessem livremente a rede e executem todos os jobs e sincronizações pendentes. Se o dispositivo ficar inativo por longos períodos, o sistema vai permitir que apps inativos acessem a rede cerca de uma vez por dia.
Usar o FCM para interagir com o app enquanto o dispositivo estiver inativo
O Firebase Cloud Messaging (FCM) é um serviço de nuvem para dispositivos que permite oferecer suporte a mensagens downstream em tempo real entre serviços de back-end e apps em dispositivos Android. O FCM fornece uma conexão única e permanente 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 da 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, é altamente recomendável usar 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 ociosos de Soneca e App em espera. As mensagens de alta prioridade do FCM permitem que você ative seu app para engajar o usuário. No modo Soneca ou App em espera, o sistema entrega a mensagem e dá ao app acesso temporário a serviços de rede e wakelocks parciais, depois retorna o dispositivo ou app ao estado inativo. Para notificações visíveis ao usuário e urgentes, considere o uso de mensagens de alta prioridade para ativar a entrega no modo Soneca. Mensagens de alta prioridade podem resultar em notificações. Para mais informações, consulte as orientações do FCM sobre mensagens de alta prioridade.
Para mensagens que não resultam em notificações, por exemplo, manter o conteúdo do app atualizado em segundo plano ou iniciar sincronizações de dados, use mensagens normais do FCM de prioridade. As mensagens de prioridade normal serão entregues imediatamente se o dispositivo não estiver no modo Soneca. Se o dispositivo estiver no modo Soneca, eles serão entregues durante as janelas de manutenção periódicas ou assim que o usuário ativar o dispositivo.
Como prática recomendada geral, se o app exigir mensagens downstream, use o FCM. Caso seu app já use o FCM, verifique se ele usa mensagens de prioridade alta somente para mensagens que resultam em notificações voltadas para o usuário.
Compatibilidade com outros casos de uso
Quase todos os apps são compatíveis com a Soneca, gerenciando conectividade de rede, alarmes, trabalhos e sincronizações e usando mensagens 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 dos recursos Soneca e App em espera.
Um app parcialmente isento pode usar a rede e manter wake
locks parciais durante os recursos Soneca e App em espera. No entanto, outras restrições ainda se aplicam
ao app, da mesma forma que ocorre com outros apps. Por exemplo, os jobs e as sincronizações do app
são adiados na API de nível 23 e anteriores, e os alarmes normais
AlarmManager
não são acionados. Um app pode verificar se está
na lista de isenções chamando
isIgnoringBatteryOptimizations()
.
O usuário pode configurar manualmente a lista de apps isentos em Configurações > Bateria > Otimização da bateria. Como alternativa, o sistema oferece maneiras para os apps solicitarem que os usuários os isentem:
- A maioria dos apps pode invocar uma intent que contém a
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 da intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
para permitir que o usuário adicione o app diretamente à lista de isenções, sem acessar as configurações do sistema.
Um app pode verificar se está na lista de isenções chamando
isIgnoringBatteryOptimizations()
.
Testar com os recursos Soneca e App em espera
Para ajudar a garantir uma ótima experiência para os usuários, teste o app totalmente nos modos Soneca e App em espera.
Testar o app com a Soneca
Teste o modo Soneca fazendo o seguinte:
- Configure um dispositivo de hardware ou dispositivo virtual com um Android 6.0 (API de nível 23) ou uma imagem de sistema mais recente.
- Conecte o dispositivo à máquina de desenvolvimento e instale o aplicativo.
- Execute o aplicativo e deixe-o ativo.
- Force o sistema a entrar no modo inativo executando este comando:
$ adb shell dumpsys deviceidle force-idle
- Quando estiver tudo pronto, saia do modo inativo executando este 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. Certifique-se de que o app se recupera normalmente quando o dispositivo sai do modo Soneca.
Testar o app com o 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 um Android 6.0 (API de nível 23) ou uma imagem de sistema mais recente.
- Conecte o dispositivo à máquina de desenvolvimento e instale o aplicativo.
- Execute o aplicativo e deixe-o ativo.
- Execute os seguintes comandos para forçar o app a entrar no modo App em espera:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- Simule o despertar do 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. Mais especificamente, 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 da intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
nessas situações. Em geral, seu app não atende a essas
exceções, a menos que os recursos Soneca ou App em espera interrompam a função principal do app ou
haja um motivo técnico para o app não usar mensagens de alta prioridade
do FCM.
Para mais informações, consulte Suporte para outros casos de uso.
Tipo | Caso de uso | Pode usar o FCM? | Isenção aceitável? | Notes |
---|---|---|---|---|
Mensagens instantâneas, bate-papo ou app de chamada. | Requer a entrega de mensagens em tempo real para os usuários enquanto o dispositivo está no modo Soneca ou o app está no modo App em espera. | Sim, usando o FCM. | Não aceitável | Use mensagens FCM de alta prioridade para ativar o app e acessar a rede. |
Sim, mas não está usando mensagens FCM de alta prioridade. | ||||
Mensagens instantâneas, chat ou app de chamada; 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 os recursos Soneca e App em espera atrapalham a função principal do app. | Aceitável | ||
App Emergência | Apps que protegem usuários e famílias | Se aplicável. | Aceitável | |
App de automação de tarefas. | A função principal do app é programar ações automatizadas, como para mensagens instantâneas, chamadas de voz ou novo gerenciamento de 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 que ele tenha acesso à Internet. | 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 |