2016-08-22 2 views
1

Mein Szenario ist, dass ich möchte, dass ein Dienst in regelmäßigen Abständen einige Informationen (z. B. Standort des Benutzers) erhalten, melden Sie es an meinen Server und erhalten eine Push-Benachrichtigung, wenn der Speicherort mit einem X-Standort übereinstimmt.Verwenden von GoogleAPIClient in Hintergrunddienste

Ich würde ein paar Tipps bekommen, was der beste Mechanismus wäre, um regelmäßig Ortsinformationen abzurufen, unabhängig davon, ob die Anwendung läuft oder nicht. Hier sind die Optionen, über die ich nachgedacht habe und einige Hintergrundinformationen zu jedem.

ein Standard-Android-Service

Mein erster Gedanke herzustellen war eine STICKY-Dienst zu erstellen, die eine GoogleAPIClient initialisiert, die Standortaktualisierungen erhalten und sobald ein Standort empfangen wird, wird es an den Server senden. Das Problem, das ich bei diesem Ansatz habe, ist, dass ich die Standortinformationen regelmäßig abrufen muss. Der Dienst wird also ständig ausgeführt, auch wenn kein Standort-Scan ausgeführt wird. Auch, was wäre der beste Weg, den Standort innerhalb einer Dienstleistung zu finden?

einen Alarm mit IntentService Erstellen

Die zweite Option Ich dachte an wurde der Alarm Manager wake mit bis und eine IntentService starten, die Standort-Updates beginnt (via GoogleAPIClient). Sobald ein Standort abgerufen wurde, senden Sie diese an den Server und schließen Sie die Standortaktualisierungen. Dies würde das Problem des periodischen Startens/Stoppen von Standortaktualisierungen lösen. Jedoch hatte ich nicht viel Glück, mich innerhalb des IntentService mit GoogleAPIClient zu verbinden, ohne eine Wartezeit zu setzen, und ich denke nicht, dass das die effizienteste Sache ist.

ein GcmTaskService Erstellen

Diese viele Vorteile des Alarmmanagers hat und scheint effizienter in Bezug auf Stromsparmodus zu sein, wie es den Service nur aufwacht, wenn das Telefon in einem Wartungsmodus ist, so dass es schien, als ob eine gute Lösung. Allerdings habe ich das gleiche Problem wie der IntentService, der sich mit einem GoogleAPIClient verbindet, um den Standort ohne irgendeine Art von Wartezeit zu erhalten.

Ich gehe vielleicht zu weit in das Kaninchenloch auf diesem einen und dort kann etwas offensichtlich sein, dass ich vermisse, so würde jeder Ratschlag sehr geschätzt werden.

Antwort

0

Ich hatte das gleiche Problem. Ich ging zum ersten Mal (ein klebriger Service) und alles hat gut funktioniert. Mir gefiel jedoch nicht, dass der Dienst immer lief und für den Benutzer sichtbar war. Aus diesem Grund habe ich mich entschieden, die JobScheduler API zu verwenden, da dies die bevorzugte Art ist, Hintergrundarbeit gemäß docs auszuführen.

Wenn Ihre App auf API> = 21 abzielt, dann ist JobScheduler der richtige Weg. Wenn Sie ältere Versionen der Plattform unterstützen möchten, sollten Sie die kürzlich eingeführte Bibliothek Firebase JobDispatcher verwenden, die leider keine Dokumentation enthält.

Alles wird in einer Google I/O 2016-Präsentation here erläutert. Schau es dir an.

+0

Ja, genau das habe ich mir auch gedacht. Wie haben Sie die Verbindung mit dem GoogleAPIClient in Ihrem JobScheduler gehandhabt? Verwenden Sie das blockingConnect mit einem Timeout oder einer anderen Methode? – pkramaric

+0

Ich verwende die nicht blockierende Methode [connect()] (https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()) und dann I Behandeln Sie den Job abhängig vom Verbindungsergebnis (Methoden onConnected, onConnectionFailed). – kws

0

Wenn Sie Updates anfordern, können Sie eine maximale Häufigkeit anfordern. Verwenden Sie einfach einen Dienst und legen Sie die maximale Häufigkeit gleich dem gewünschten Abfrageintervall fest. Kein AlarmManager benötigt.

+0

Ich dachte, dass ich gerade nicht sicher war, ob es der effizienteste Ansatz war, wenn die maximale Frequenz mehrere Stunden auseinander liegen wird (benutzerdefiniert). Ich dachte, dass das Starten/Stoppen des FusedLocationApi effizienter war. – pkramaric

Verwandte Themen