Der beste Weg, um den GPS-Standort im Hintergrund für Android API Level 30 und höher zu erhalten

Nov 30 2020

Meine Anwendung bestimmt das Tempolimit anhand des Standorts des Benutzers und teilt dem Benutzer mit, ob er es überschritten hat. Ab Android API Level 30 und höher hat Google IntentService als veraltet definiert und schlägt die Verwendung von WorkManager oder JobIntentService vor. Außerdem muss die Migration von Firebase JobDispatcher zu WorkManager erforderlich sein. Ich sehe zwei Möglichkeiten, um dieses Problem zu lösen:

  1. Starten Sie OneTimeWorkRequest und geben Sie an, dass diese Methode in dieser Methode regelmäßig neu gestartet werden soll, während die Anwendung im Hintergrund ausgeführt wird.
  2. Führen Sie PeriodicWorkRequest mit einem zulässigen Mindestintervall von 15 Minuten aus. Führen Sie in dieser Methode die JobIntentService-Methode aus, die bis zu 10 Minuten lang ausgeführt wird. Die Methode wird jedoch möglicherweise nicht ausgeführt oder vom System zerstört, bevor sie abgeschlossen ist.

Ich mache mir Sorgen über:

  • mögliche Speicherlecks;
  • Mögliche Probleme mit WorkManager oder JobIntentService beim Übergang vom Vordergrund zum Hintergrund und umgekehrt
  • die Fähigkeit, das MVVM-Muster zu verwenden

Antworten

5 NikolaDespotoski Dec 07 2020 at 23:42

Ich würde es vorziehen, mit der zweiten Option zu gehen, es gibt Ihnen mehr Zeit zwischen jeder Neuplanung der Worker.

In Bezug auf Ihre Bedenken:

  • Ein mögliches Leck ist das Fehlverhalten von Standortrückrufen. Dies kann leicht aufgespürt werden, Sie sollten sich nicht zu viele Sorgen machen.
  • Geplante Workerwerden in die Datenbank gestellt und unabhängig von der Anwendung ausgeführt. Dies bedeutet, dass die Benutzersichtbarkeit der Anwendung keine Auswirkungen hat. In Ihrem Fall, ich nehme an, Sie möchten , dass Ihre geplante Arbeit abzubrechen , sobald der Benutzer die Anwendung wieder aufgenommen wird , sagte , dass Sein Sie zuweisen können , tagum die Workerund reinigen jede geplante oder laufende einmal für den Benutzer sichtbar.
  • Ich ziehe es vor, Workers von der MVVM isoliert zu halten und nur Anwendungsfälle / Interaktoren in den Worker zu injizieren und den Anwendungsfall auszuführen / den Interaktor abzufragen. WorkerManagerbietet feine APIs zum Abfragen des WorkerStatus. Möglicherweise müssen Sie eine gemeinsame Basis zwischen Ihrer vorherigen Implementierung und für API> = 30 schreiben. Behandeln Sie den WorkerContainer als unterschiedlichen Ausführungscontainer für Ihren Anwendungsfall.