Melhor maneira de serviço que inicia a atividade para se comunicar com ele

StackOverflow https://stackoverflow.com/questions/2274641

  •  20-09-2019
  •  | 
  •  

Pergunta

Eu tenho um serviço que ouve um soquete. Ao receber determinadas entradas, é para criar uma atividade. Ao receber outra entrada, é para matar essa atividade. Eu lutei por um tempo para fazer o serviço se comunicar com a atividade através da AIDL (http://developer.android.com/guide/developing/tools/aidl.html), mas isso parece não ser eficaz. Eu acho que a Aidl só é eficaz quando o processo com quem deve ser discutido é um serviço, não quando é uma atividade? Eu adoraria algumas direções ou sugestões sobre como resolver meu problema.

Saúde,

Foi útil?

Solução

Eu tenho um serviço que ouve um soquete. Ao receber determinadas entradas, é para criar uma atividade.

Faça isso configurável. Os serviços não devem estar iniciando atividades, exceto em muito Circunstâncias incomuns (por exemplo, o soquete é uma conexão SIP e você está criando um cliente VoIP). Aparar uma atividade interrompe o usuário em tudo o que eles estão fazendo.

Ao receber outra entrada, é para matar essa atividade.

O único cenário que vi onde esse é um padrão válido é descartar a tela de plantão quando a outra parte desligar a linha. Se você estiver criando um cliente VoIP, seu padrão proposto deve estar bem, mas, caso contrário, reconsidere que a atividade desaparece no meio do usuário usando -a.

Eu acho que a Aidl só é eficaz quando o processo com quem deve ser discutido é um serviço, não quando é uma atividade?

Não, também funciona na direção inversa, mas geralmente apenas se a atividade for a que inicia o serviço e a ligação a ele. Mais importante, a AIDL é apenas para comunicação cruzada.

Eu adoraria algumas direções ou sugestões sobre como resolver meu problema.

Você realmente não forneceu informações suficientes sobre a natureza da comunicação para fornecer uma resposta completa. O que exatamente o serviço está tentando dizer a atividade? A atividade também está tentando se comunicar com o serviço?

O padrão recomendado para a comunicação contínua de uma atividade para um serviço é usar o padrão de ligação local. Você encontrará um exemplo disso em suas amostras de SDK, e você pode encontrar um aqui também.

O serviço tem opções para se comunicar de volta ao cliente: através de um retorno de chamada (por exemplo, o Handler na resposta fornecida pelo Sr. Smiljanić) ou via transmissão Intents. No caso do retorno de chamada, a atividade precisaria se vincular ao serviço para obter acesso a uma API para fornecer o objeto de retorno de chamada. O serviço seguraria esse objeto e chamaria métodos nele durante os principais eventos.

Se o seu serviço estiver fazendo seu trabalho principal em um encadeamento de segundo plano, você precisará garantir que suas operações de interface do usuário sejam executadas no thread da interface do usuário. o Handler é uma abordagem para isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top