Meilleur moyen d'obtenir la localisation GPS en arrière-plan pour l'API Android de niveau 30 et supérieur

Nov 30 2020

Mon application détermine la limite de vitesse en fonction de l'emplacement de l'utilisateur et indique à l'utilisateur s'il l'a dépassée. À partir du niveau d'API Android 30 et supérieur, Google a défini IntentService comme obsolète et suggère d'utiliser WorkManager ou JobIntentService et déclare également qu'il est nécessaire de migrer de Firebase JobDispatcher vers WorkManager. Je vois deux façons de résoudre ce problème:

  1. Démarrez OneTimeWorkRequest et spécifiez de redémarrer cette méthode périodiquement dans cette méthode pendant que l'application s'exécute en arrière-plan.
  2. Exécutez PeriodicWorkRequest avec un intervalle minimum autorisé de 15 minutes. Dans cette méthode, exécutez la méthode JobIntentService, qui s'exécute jusqu'à environ 10 minutes , mais la méthode peut ne pas s'exécuter ou être détruite par le système avant qu'elle ne soit terminée.

Je suis inquiet au sujet de:

  • les fuites de mémoire potentielles;
  • problèmes potentiels avec WorkManager ou JobIntentService lors du passage du premier plan à l'arrière-plan et vice versa
  • la possibilité d'utiliser le modèle MVVM

Réponses

5 NikolaDespotoski Dec 07 2020 at 23:42

Je préférerais opter pour la deuxième option, cela vous laisse plus de temps entre chaque reprogrammation du Worker.

Concernant vos préoccupations:

  • La seule fuite possible concerne les rappels d'emplacement incorrects. Cela peut être facilement retrouvé, vous ne devriez pas trop vous en soucier.
  • Les programmés Workersont mis dans la base de données et sont exécutés indépendamment de l'application. Ce qui signifie que la visibilité utilisateur de l'application n'a aucun effet. Dans votre cas, je suppose que vous souhaitez annuler votre travail planifié une fois que l'utilisateur a repris l'application, cela étant dit, vous pouvez attribuer un tagà Workeret purger tout programme planifié ou en cours une fois visible par l'utilisateur.
  • Je préfère garder les Workers isolés du MVVM et injecter simplement des cas d'utilisation / interacteurs dans le worker et exécuter le cas d'utilisation / interroger l'interacteur. WorkerManagerpropose des API fines pour interroger l' Workerétat, vous devrez peut-être écrire un terrain d'entente entre votre implémentation précédente et pour API> = 30. Traitez le Workercomme un conteneur d'exécution différent pour votre cas d'utilisation.