Quando o usuário deixa o dispositivo Android ocioso, ele entra rapidamente no estado de suspensão para evitar o descarregamento da bateria. No entanto, há momentos em que um app precisa impedir que a CPU entre no estado de suspensão. Em alguns casos, o app pode precisar manter a tela ligada enquanto estiver funcionando. Em outros casos, o app não precisa manter a tela ligada, mas ainda precisa que a CPU esteja ativa.
O método escolhido depende das necessidades do app. No entanto, uma regra geral é usar a abordagem mais leve possível para minimizar o impacto do app nos recursos do sistema. Este documento ajuda você a escolher a tecnologia Android correta para sua situação.
Escolher a tecnologia certa
A melhor opção para manter o dispositivo ativo depende das necessidades do app. Esta seção ajuda você a escolher a abordagem certa.
- O app precisa manter a tela ligada?
- Se a resposta for Sim, consulte Manter a tela ligada. Talvez haja uma
API de finalidade especial que faça o que você precisa. Por exemplo, se você estiver
implementando uma interface de ligação, use o framework de telecomunicações
do Android, que mantém a tela ligada quando necessário. Se não houver uma
API de finalidade especial para sua situação, use a API
keepScreenOn
.
- Se a resposta for Sim, consulte Manter a tela ligada. Talvez haja uma
API de finalidade especial que faça o que você precisa. Por exemplo, se você estiver
implementando uma interface de ligação, use o framework de telecomunicações
do Android, que mantém a tela ligada quando necessário. Se não houver uma
API de finalidade especial para sua situação, use a API
- O app está executando um serviço em primeiro plano e você precisa manter o dispositivo
acordado quando a tela estiver desligada enquanto o serviço estiver em execução?
- Se a resposta for Não, não será necessário manter o dispositivo ativo. Se o usuário interagir ativamente com o app, o dispositivo vai permanecer ativo. Se o usuário não estiver interagindo com o app e você não estiver executando um serviço em primeiro plano, deixe o dispositivo entrar no modo de suspensão quando necessário. Se você só precisa garantir que algum trabalho seja concluído enquanto o usuário está longe do app, consulte a documentação de tarefas em segundo plano para encontrar a melhor opção.
- Se a resposta for Sim, primeiro confirme se você realmente precisa usar um serviço
em primeiro plano. Dependendo da situação, talvez haja uma API
de finalidade especial que você possa usar para atender à sua necessidade em vez de um serviço em primeiro plano.
Confira informações sobre isso na documentação do serviço em primeiro
plano. Por exemplo, se você precisar rastrear a localização do usuário, use a API Geofencing em vez de um serviço em primeiro plano
location
.
- A experiência do usuário seria prejudicada se o dispositivo fosse suspenso enquanto
o serviço em primeiro plano estivesse em execução e a tela do dispositivo estivesse desligada? Por
exemplo, se você estiver usando um serviço em primeiro plano para atualizar notificações, não
seria uma experiência do usuário ruim se o dispositivo estiver suspenso.
- Se a resposta for Não, não use um wakelock. A ação é retomada automaticamente quando o usuário interage com o dispositivo, o que o tira do modo de suspensão.
- Se a resposta for Sim, talvez seja necessário usar um wake lock. No entanto, você ainda precisa verificar se já está usando uma API ou realizando uma ação que declara um bloqueio de ativação em seu nome, conforme discutido em Ações que mantêm o dispositivo ativo.
Ações que mantêm o dispositivo ativado
Se o app estiver fazendo qualquer uma das ações abaixo, não será necessário definir um wake lock por conta própria. As ações e APIs a seguir mantêm o dispositivo ativo para você.
- Se você estiver reproduzindo áudio, o sistema de áudio vai definir e gerenciar um bloqueio de ativação para você. Não é necessário fazer isso manualmente.
- Se você estiver usando APIs ou bibliotecas de programação de tarefas, como WorkManager,
JobScheduler
ouDownloadManager
, o sistema ou a biblioteca vai adquirir uma trava de ativação em seu nome. - Se você estiver usando o ExoPlayer da Media3, poderá usar
ExoPlayer.setWakeMode()
para que o player defina um bloqueio de ativação para você. - Alguns sensores do dispositivo são sensores de ativação. É possível usar
SensorManager
para que esses sensores ativem o dispositivo quando tiverem dados para informar. Para verificar se um sensor é um sensor de ativação, chameSensor.isWakeUpSensor
.