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:
- 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.
- 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
Worker
sont 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 untag
àWorker
et purger tout programme planifié ou en cours une fois visible par l'utilisateur. - Je préfère garder les
Worker
s 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.WorkerManager
propose 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 leWorker
comme un conteneur d'exécution différent pour votre cas d'utilisation.