Android: Manipulação de localização opcional
-
27-09-2019 - |
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,
- 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"
- 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.
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).