Melhor maneira de obter a localização do GPS em segundo plano para Android API de nível 30 e superior

Nov 30 2020

Meu aplicativo determina o limite de velocidade pela localização do usuário e diz ao usuário se ele o excedeu. A partir da API Android de nível 30 e superior, o Google definiu IntentService como obsoleto e sugere o uso de WorkManager ou JobIntentService e também afirma que é necessário migrar do Firebase JobDispatcher para o WorkManager. Vejo duas maneiras de resolver esse problema:

  1. Inicie OneTimeWorkRequest e especifique para reiniciar este método periodicamente neste método enquanto o aplicativo está sendo executado em segundo plano.
  2. Execute PeriodicWorkRequest com um intervalo mínimo permitido de 15 minutos. Neste método, execute o método JobIntentService, que é executado por cerca de 10 minutos , mas o método pode não ser executado ou pode ser destruído pelo sistema antes de ser concluído.

Estou preocupado sobre:

  • potenciais vazamentos de memória;
  • problemas potenciais com WorkManager ou JobIntentService ao passar do primeiro plano para o segundo plano e vice-versa
  • a capacidade de usar o padrão MVVM

Respostas

5 NikolaDespotoski Dec 07 2020 at 23:42

Eu preferiria ir com a segunda opção, isso dá a você mais tempo entre cada reprogramação do Worker.

Em relação às suas preocupações:

  • O único vazamento possível é a condução incorreta de retornos de chamada de localização. Isso pode ser facilmente rastreado, você não deve se preocupar muito com isso.
  • Os agendados Workersão colocados no banco de dados e executados independentemente da aplicação. O que significa que a visibilidade do aplicativo pelo usuário não tem efeito. No seu caso, presumo que você deseja cancelar seu trabalho agendado assim que o usuário retomar o aplicativo, isto é, você pode atribuir um tagao Workere eliminar qualquer agendado ou em andamento que esteja visível para o usuário.
  • Eu prefiro manter os Workers isolados do MVVM e apenas injetar casos de uso / interatores no trabalhador e executar o caso de uso / consulta ao interagente. WorkerManageroferece APIs excelentes para consultar o Workerstatus, você pode precisar escrever um terreno comum entre sua implementação anterior e para API> = 30. Trate o Workercomo um contêiner de execução diferente para seu caso de uso.