segunda-feira, 30 de janeiro de 2012

Não deixe o seu Android dormir em serviço!


Estava dando uma estudada em atividades em background e me deparei com uma nota no Alarm Manager que eu não tinha conhecimento.  Fiz uma tradução livre, que cito abaixo:
"O Alarm Manager mantém um bloqueio que mantém a CPU funcionando (CPU wake lock) enquanto o método OnReceive do receiver receptor do alarme está sendo executado. Isso garante que o telefone não vai dormir (sleep) até ter terminado de manusear o broadcast. Uma vez que o OnReceive () retorne, o Alarm Manager libera esse bloqueio. Isso significa que o telefone em alguns casos, entra em sleep assim que o seu OnReceive () é concluído. Se o seu Receiver do alarme chama o Context.startService (), é possível que o telefone possa entrar em sleep antes de o serviço solicitado seja iniciado. Para evitar isso, o seu BroadcastReceiver e o Service precisam implementar uma política separada de wake lock para garantir que o telefone continue funcionando até que o serviço esteja disponível."
Então, fui dar uma pesquisada no assunto e encontrei como implementar essa tal de política de wake lock.
Para isso, usamos o serviço  do PowerManager. No exemplo mantemos a CPU rodando para executar um serviço. Essa opção é perfeita para o caso devido ao fato de que a CPU ficará rodando mesmo que o usuário aperte a tecla power.


Normalmente, colocamos o acquire no onCreate e o release no onDestroy.
Outra coisa, não devemos abusar disso devido ao fato de que isso vai consumir muito mais bateria do que o normal, principalmente nas outras opções que mantém o visor ligado.

Outras opções:



Mais detalhes:
http://developer.android.com/reference/android/app/AlarmManager.html
http://developer.android.com/reference/android/os/PowerManager.html

PS: estava esquecendo, precisa da permissão: android.permission.WAKE_LOCK

Bons códigos!

Um comentário: