Iniciar IntentService Android com AlarmManager e BroadcastReceiver

postado em: Android | 0

Olá pessoal,

Hoje vou mostrar um exemplo de aplicativo que inicia um IntentService no Android usando AlarmManager e este serviço envia mensagens para a tela do app.

Estou disponibilizando este exemplo porque demorou um pouco pra chegarmos neste modelo, e não haviam muitos exemplos que atendessem a nossa necessidade.

Temos um projeto em um dos nossos clientes que roda o serviço em background pois necessita realizar a sincronização dos dados de tempos em tempos. Essa sincronização é necessária pois o aplicativo roda off-line. Uma das boas práticas para economia de energia do aparelho e adotada fortemente a partir do Android 8 é não deixar serviços rodando eternamente, por isso precisávamos de uma solução que iniciasse a sincronização automaticamente, pois isso não poderia ficar a cargo do usuário. Na época, a solução que encontramos e nos atendeu muito bem foi o AlarmManager, pois ele roda no tempo programado e inicia o serviço.

Para iniciar o AlarmManager, setar os seguintes dados:

Feito isso, seu alarme está registrado no sistema e será chamado assim que o sistema rodar a coleta de alarmes e a data de início for menor ou igual a data atual.

Quando o sistema disparar o seu alarmManager, você deve interceptar essa ação utilizando uma classe que estende de BroadcastReceiver. Nessa classe, deve conter o seguinte código dentro do método onReceive:

Ao cair neste ponto, seu serviço será iniciado.

A partir do Android 8, no onCreate do serviço, é necessário criar uma notificação com startForeground em até 5 segundos, caso contrário o serviço será interrompido.

Uma dica importante: utilize sempre um número maior que 0 no ID da sua notificação. Quando estava testando o app, estava com erro para iniciar no Android 8 por que eu estava usando 0.

Então no método onHandleIntent você vai criar a sua lógica e atualizar o Progress Notification.

Caso precise atualizar a tela do seu aplicativo com alguma informação do serviço, na tela que irá receber essa informação você vai registrar um BroadcastReceiver com uma action de identificação.

Lembrando sempre de registrar o receiver ao abrir a tela e remover ao fechá-la.

Aí no serviço basta enviar a mensagem através do método sendBroadcast passando a action para identificação:

Pronto, seu serviço com start automático, com barra de progresso e comunicação com a tela do seu app está pronto.

Segue o link do projeto no Github:

https://github.com/altieresbianchi/AlarmManagerStartService

É isto, espero ter ajudado!

Comentários são bem-vindos.

Seguir Altieres Bianchi:

Analista Desenvolvedor Mobile e Web, formado pela Universidade Tuiuti do Paraná e pós-graduado pela UTFPR.