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

Figura 1. O "Soneca" fornece uma janela de manutenção recorrente para que os apps usem a rede e realizem atividades pendentes.

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:

Lista de verificação do 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:

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:

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

  1. 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.
  2. Conecte o dispositivo à máquina de desenvolvimento e instale o aplicativo.
  3. Execute o aplicativo e deixe-o ativo.
  4. 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
        
  5. Simule o despertar do 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. 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