Tenho um serviço que verifica constantemente se há novas tarefas. Se houver uma nova tarefa, quero atualizar a IU de atividade para mostrar essa informação. Encontrei https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ este exemplo. Essa é uma boa abordagem? Algum outro exemplo?
Obrigado.
Respostas:
Veja abaixo minha resposta original - esse padrão funcionou bem, mas recentemente comecei a usar uma abordagem diferente para comunicação de serviço / atividade:
Use RxJava para executar operações assíncronas.
Se o serviço precisar continuar as operações em segundo plano mesmo quando nenhuma atividade estiver em execução, inicie também o serviço da classe de aplicativo para que ele não seja interrompido quando não ligado.
As vantagens que encontrei nesta abordagem em comparação com a técnica startService () / LocalBroadcast são
Algum código de exemplo. Primeiro o serviço:
E uma atividade que se liga ao serviço e recebe atualizações de altitude de pressão:
O layout para esta atividade é:
Se as necessidades de serviço para ser executado em segundo plano, sem uma atividade ligada pode ser iniciado a partir da classe de aplicações, bem como no
OnCreate()
usoContext#startService()
.Minha resposta original (de 2013):
No seu serviço: (usando COPA como serviço no exemplo abaixo).
Use um LocalBroadCastManager. No onCreate do seu serviço, configure a emissora:
Quando você deseja notificar a IU sobre algo:
Em sua atividade:
Crie um listener em onCreate:
e registre-o no onStart:
fonte
onStart()
ouonResume()
. Em geral, se a Activity pede ao serviço para fazer algo, mas sai antes de receber o resultado, é razoável supor que o resultado não é mais necessário. Da mesma forma, ao iniciar uma Atividade, ele deve assumir que não há solicitações pendentes sendo processadas pelo Serviço.para mim a solução mais simples era enviar um broadcast, na atividade oncreate eu registrei e defini o broadcast assim (updateUIReciver é definido como uma instância de classe):
E a partir do serviço, você envia a intenção desta forma:
não se esqueça de cancelar o registro da recuperação na atividade de destruição:
fonte
Eu usaria um serviço vinculado para fazer isso e me comunicar com ele implementando um ouvinte em minha atividade. Portanto, se seu aplicativo implementa myServiceListener, você pode registrá-lo como um ouvinte em seu serviço depois de vinculá-lo, chame listener.onUpdateUI de seu serviço vinculado e atualize sua IU lá!
fonte
Eu recomendaria dar uma olhada no Otto , um EventBus feito especificamente para Android. Sua atividade / IU pode ouvir eventos postados no ônibus do serviço e se desacoplar do back-end.
fonte
A solução de Clyde funciona, mas é uma transmissão, que tenho certeza de que será menos eficiente do que chamar um método diretamente. Posso estar enganado, mas acho que as transmissões se destinam mais à comunicação entre aplicativos.
Estou assumindo que você já sabe como vincular um serviço a uma atividade. Eu faço algo parecido com o código abaixo para lidar com esse tipo de problema:
Eu deixei de fora algumas partes para a segurança do thread, que é essencial. Certifique-se de usar bloqueios ou algo parecido ao verificar e usar ou alterar as referências de fragmento no serviço.
fonte
fonte
Minha solução pode não ser a mais limpa, mas deve funcionar sem problemas. A lógica é simplesmente criar uma variável estática para armazenar seus dados no
Service
e atualizar sua visualização a cada segundo no seuActivity
.Digamos que você tenha um
String
em seu eService
deseja enviá-lo para umTextView
em seuActivity
. Deve ser assimSeu serviço:
Sua atividade:
fonte
android
sim, se for uma lista, tente criar um adaptador ou persistir os dados usando sqllite / realm db.