Pergunta

Eu tenho um aplicativo Android que pode operar com ou sem um local. Lidar com este caso em uma atividade é direto: defino um ouvinte de localização e espero com uma caixa de diálogo de progresso, mas permito que a espera seja abortada pelo usuário (acontece que, se o provedor de localização estiver desativado, não há erro especial, nunca será Retorna a localização ... legal).

No entanto, também tenho um serviço que requer o local. O serviço pode ser executado antes da atividade, por isso não posso depender da atividade para obter o local (ou não).

A questão é como lidar com este caso no serviço. Posso esperar pelo local, mas como não posso confiar em um usuário abortar, como sei quando parar de esperar e assumir que nenhum local está disponível? Parece que eu poderia fazer algo como,

  1. Agende o serviço com a ação "Get Location", que define o ouvinte do local, aguarda atualizações, agenda o mesmo serviço, digamos 3 minutos depois com a ação "Atualizar"
  2. Na ação de serviço "Atualizar", obtenha o último local conhecido e fique feliz com isso. Foi obtido ou não. Se for nulo, sabemos que não temos localização e fizemos o melhor que podemos.

Parece que isso funcionará, mas está ficando complicado, pois não posso mais usar o serviço de intenção simples (suponho), porque se o serviço de intenção parar após o OnHandleIntent (), o evento alterado no local não será recebido.

De qualquer forma, está ficando meio complicado, por isso estou me perguntando se há uma maneira mais simples.

Foi útil?

Solução

Respondendo à minha própria pergunta ... eis como eu acabei resolvendo isso,

UpdateService - Serviço de intenção que realmente faz o trabalho de atualização. Este apenas chama getLastknownLocation () para obter o local.

Locationservice - Serviço regular que se registra para atualizações de localização e também define um timer para acordar em 2 minutos. Ou obtemos a atualização do local ou o timer dispara. Se obtivermos a atualização do local, cancelamos o timer. Nos dois casos, não registramos atualizações de localização e iniciamos o UpdateService para fazer o trabalho real e depois paramos.

Agendamos o Locationservice como o alarme repetido para ser nosso processo de "plano de fundo".

A atividade lida com as coisas de maneira diferente. Ele solicita atualizações de localização e coloca uma caixa de diálogo. Ou obtemos a atualização do local ou o usuário cancela a caixa de diálogo. De qualquer forma, não registramos atualizações de localização e iniciamos o UpdateService diretamente (não o Locationservice, já temos o local aqui).

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