La mejor manera de obtener la ubicación GPS en segundo plano para el nivel de API de Android 30 y superior
Nov 30 2020
Mi aplicación determina el límite de velocidad por la ubicación del usuario y le dice al usuario si lo ha excedido. A partir del nivel de API de Android 30 y superior, Google ha definido IntentService como obsoleto y sugiere usar WorkManager o JobIntentService y también afirma que es necesario migrar de Firebase JobDispatcher a WorkManager. Veo dos formas de resolver este problema:
- Inicie OneTimeWorkRequest y especifique reiniciar este método periódicamente en este método mientras la aplicación se está ejecutando en segundo plano.
- Ejecute PeriodicWorkRequest con un intervalo mínimo permitido de 15 minutos. En este método, ejecute el método JobIntentService, que se ejecuta durante unos 10 minutos , pero es posible que el método no se ejecute o que el sistema lo destruya antes de que se complete.
Estoy preocupado:
- posibles fugas de memoria;
- posibles problemas con WorkManager o JobIntentService cuando se pasa del primer plano al segundo plano y viceversa
- la capacidad de utilizar el patrón MVVM
Respuestas
5 NikolaDespotoski Dec 07 2020 at 23:42
Preferiría ir con la segunda opción, te da más tiempo entre cada reprogramación del Worker
.
Respecto a sus inquietudes:
- La única fuga posible son las devoluciones de llamada de ubicación incorrectas. Esto se puede rastrear fácilmente, no debe preocuparse demasiado por eso.
- Los programados
Worker
se colocan en la base de datos y se ejecutan independientemente de la aplicación. Lo que significa que la visibilidad de la aplicación por parte del usuario no tiene ningún efecto. En su caso, supongo que desea cancelar el trabajo programado una vez que el usuario reanude la aplicación, dicho esto se puede asignar unatag
a laWorker
y purgar cualquier programado o en curso una vez visible para el usuario. - Prefiero mantener
Worker
s aislado del MVVM y solo inyectar casos de uso / interactores en el trabajador y ejecutar el caso de uso / consultar el interactor.WorkerManager
ofrece buenas API para consultar elWorker
estado, es posible que deba escribir un terreno común entre su implementación anterior y para API> = 30. Trate elWorker
contenedor de ejecución como diferente para su caso de uso.