Live Standort

S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Hallo Freunde,
Ich habe folgendes Problem.
Meine Anwendung ist sammelt regelmäßig Standort-Daten um später einen Streckenverlauf dar zu stellen, oder auch um das Gerät auf einer "Live Karte" darzustellen.

Sammeln tue ich diese via ALARM_MANAGER, der auf ein Intervall von 30 Sek eingestellt ist.
Dies funktioniert auch super, solange das Gerät geladen oder generell verwendet wird. Sobald es in den Deep-Standby geht, bekomme ich frühestens alle 5 min einen Standort. Dieser Zyklus ist aber leider zu lang
Welche Optionen habe ich noch , wenn ich die Standortdaten zwingend benötige?
Sie werden aktuell schon in eine Room DB geschrieben und von dort aus hochgeladen, aber auch diese Protokollierung läuft im selben Takt wieder das eigentliche Sammeln.

Ich freue mich auf Ratschläge
 
D

deek

Stammgast
Foreground Service. Alles andere macht keinen Sinn und wird schnell gedrosselt.
Kann man überhaupt im Hintergrund noch Standortdaten bekommen?
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Ja es ist noch möglich, aber schwierig. Auch Android 10 hat das ganze nicht besser gemacht.
Was unterscheidet denn Hauptsächlich der ForgroundService von Service ?
 
D

deek

Stammgast
Ein ForegroundService muss dauerhaft eine Notification anzeigen. Damit der User sieht, dass da was passiert.
 
swa00

swa00

Moderator
Teammitglied
Du könntest dir einen Service basteln und den mit interval-mäßig dann neu starten , bevor ihn android tötet. (Heartbeat)
 
D

deek

Stammgast
Da hast du halt eigentlich dasselbe Problem. Wenn dein Service gekillt wird und dein nächster per AlarmManager getriggerter Service Start wird 5-10 min deferred bist du in der gleiche Situation wie wenn du die Daten in dem AlarmManager intervall abrufst.
Ich votiere für Background Service inklusive den Nutzer fragen ob man die Battery Optimizations deaktivieren darf. Damit funktioniert das in einer meiner Apps recht gut.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Aktuell nutze ich bereits einen Heartbeat der auf 30 sek getaktet ist und einen Worker startet.
Die Battery Optimizations sind deaktiviert.

Ich denke das Problem liegt am Alarm-Manager, dieser lässt sich ab einem bestimmten punkt nur alle 5 Minuten triggern ...
 
J

jogimuc

Erfahrenes Mitglied
Der alarmmanager kann bei automatischer Wiederholung und activer app nur minimal eine min. Wenn die app im Hindergrund ist zb Display aus nur ca 5 min.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Welche Optionen gibt es denn sonst noch?
 
J

jogimuc

Erfahrenes Mitglied
Das wurde doch schon gesagt. ForegroundService.
Und das von deek ist wohl die beste Lösung.
-- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
Ein 30 sek tackt mit alarmmanager geht mit Sicherheit nicht.. Wie gesagt etwas 5 min.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
ForgroundService wird verwendet ...
Und doch , ein 30 Sek takt geht. Schließlich klappt es ja bei mir.
In dem Sinne wird er ja auch nicht wiederholt, sondern neu erstellt.
 
J

jogimuc

Erfahrenes Mitglied
Wenn du den alarmmanager im Service immer wider neu startest also keine Auto
repesting schedule machst kann das villeicht gehen.
 
D

deek

Stammgast
Wenn du schon einen Foreground Service verwendest sehe ich das Problem nicht? Der sollte eigentlich im Normalfall nicht nach 5 Minuten schon beendet sein.
Also du solltest den Service laufen lassen. Nicht starten, Aktion durchführen, wieder beenden.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Verwenden tue ich diesen, allerdings stoppt er sich immer wieder selbst, also hängt doch alles vom Alarm Manager ab. Das ist schlecht.

Bin aktuell dabei des umzubauen, wie loope ich den Service am besten ohne jetzt wieder in die nächste Falle zu tappen?
Einfach im inneren einen Handler der mit postDelay() neu aufgerufen wird? Oder gibt es eine bessere methode?
 
D

deek

Stammgast
hmm, zeig mal deinen Service Code und wo er gestartet wird bitte.
Ansonsten wie gesagt hilft es die Battery Optimizations für deine App auszuschalten:
startActivity(new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse("package:" + getPackageName()))
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Guten Morgen Zusammen,
leider hat es etwas gedauert bis ich nun antworten kann.

Tatsächlich musste ich feststellen das es doch kein ForgroundService ist, den ich starte. (Peinlich)

Dies werde ich nun aber umbauen, nur wie loope ich diesem am besten? Mit dem Alarm_Manager nun eher ungern, da mir dort das Intervall zu lange ist.

Diesen würde ich eher gerne als Backup verwenden, der alle 15 min einmal feuert um sicher zu stellen, das der Service wirklich noch am laufen ist.
 
D

deek

Stammgast
Ich versteh die Frage immer noch nicht. Den Service an sich musst du nicht loopen, der läuft ja. (return START_STICKY)
Dein polling kannst du per Handler.postDelayed immer wieder starten.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
So war das auch von mir gemeint. Unter welchen bedingungen kann dieser Service denn beendet werden? Abgesehen davon, das der Nutzer in manuell beendet?
 
D

deek

Stammgast
Aus Energiespargründen kann Android den jederzeit beenden. Auch wenn es deutlich weniger vorkommt als bei nicht foreground Services.
Komplett verhindern kann man das nicht. (deswegen Neustart per AlarmManager, bzw ich empfehle WorkManager)
Aber es gibt noch die Möglichkeit den User zu bitten die Battery Optimizations für deine App auszuschalten, dann überlebst du deutlich länger:
Settings  |  Android Developers

Mit diesem Intent und der entsprechenden Berechtigung wird der User gefragt ob er die Optimizations für deine App ausschalten will. Ähnlich den Permissions.
 
S

SlayNox

Ambitioniertes Mitglied
Threadstarter
Okay super,
ich werde mir den WorkManager mal genauer anschauen. Ebenso die Optimizations.
 
Oben Unten