Otimizar para os modos Soneca e App em espera

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.

Figura 1. O modo soneca oferece uma janela de manutenção recorrente para que os apps usem a rede e processem atividades pendentes.

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:

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 mensagem RemoteNotification.
  • 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() e setExactAndAllowWhileIdle().
  • 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:

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:

  1. 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.
  2. Conecte o dispositivo à máquina de desenvolvimento e instale o app.
  3. Execute o app e deixe-o ativo.
  4. Force o sistema a entrar no modo ocioso executando o seguinte comando:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Quando estiver pronto, saia do modo ocioso executando o seguinte comando:
        $ adb shell dumpsys deviceidle unforce
        
  6. Reative o dispositivo executando o seguinte comando:
        $ adb shell dumpsys battery reset
        
  7. 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:

  1. 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.
  2. Conecte o dispositivo à máquina de desenvolvimento e instale o app.
  3. Execute o app e deixe-o ativo.
  4. 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
        
  5. Simule o despertar do seu app usando os seguintes comandos:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. 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