terça-feira, 20 de março de 2012

Android, comunicação Service-Activity via BroadcastReceiver

 O objetivo deste post-tutorial é implementar um exemplo de uma aplicação que faz a comunicação entre um service e uma activity usando a técnica de enviar os dados por broadcast.
 Para isso vamos continuar usando os dados do GPS (como nos exemplos anteriores) recebidos no service e via intents mensageiras entregá-las à activity através de broadcasts.
 Vamos usar um worker bound service em que implementamos um LocationListener para receber os Locations do GPS Provider, cada location é colocado numa intent com um putExtra e enviado por meio do método sendBroadcast.
 Na activity, definimos um objeto da classe BroadcastReceiver, que receberá cada intent com o location enviado pelo service. No método onReceive recuperamos os dados do location via getParcelableExtra e enviamos para uma linkedList com o autoexplicativo nome de filaUltimosLocations e desta para a tela. Para avisar o Android que a activity está apta para receber os broadcasts registramos o broadcast por meio de um registerReceiver e "unregistramos" com o unregisterReceiver.
 O código é simples, mas a idéia que engloba o mecanismo é poderosa. É só soltar as rédeas da imaginação e ver este esquema sendo usado em uma app de pedidos, de notícias, ou uma que mostra eventos de um esporte on line.
 Mas vamos voltar para a realidade.
 Seguem os códigos.

Do Service:




Da Activity:



Do List Adapter:



Da tela: main.xml

Das linhas do ListView: linhalista.xml

E finalmente uma cópia da tela:

Bons códigos!

3 comentários:

  1. Ola, estou colocando aqui pq não sei por onde começar, a procurar oque quero

    Preciso fazer uma aplicação onde irá capturar a localização, mas para isso preciso
    fechar uns pontos antes de começar com o GPS

    1. Preciso de uma forma que o app seja executado automaticamento junto com o SO(Android)
    2. Que ele fique rodando como um serviço, em segundo plano

    ResponderExcluir
  2. Olá
    1. Procure por "boot completed". Após ligar o dispositivo, vai iniciar um Receiver que deve iniciar um Service.
    2. Para não drenar a bateria o recomendado é que o Service seja executado periodicamente via um alarme.

    ResponderExcluir
  3. Boa noite, sou iniciante e estou tendo algumas dificuldades e acredito que isso que vc fez seja a resposta porem, eh meio complexo e nao entendi muito,
    bom eu tenho uma activity quem tem um button que chama uma classe java, um service, nesse service, eu falo algumas verificacoes e todo uma theard que analisa algumas coisas e quando consegue ele vibra o celular, quando eu quero que pare de vibrar eu clico em um button para parar e ele stopservice, eu queria que alem de vibrar eu mostrasse em um view analisando e depois quando vibrasse mostrasse encontrado, porem ela nao faz comunicalçao com minha activity ou seja nao conseigo dar o findByid, eu teria que fazer isso que vc ta fazendo? funcionaria?

    ResponderExcluir