Live Standort

S

SlayNox

Ambitioniertes Mitglied
15
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
 
Foreground Service. Alles andere macht keinen Sinn und wird schnell gedrosselt.
Kann man überhaupt im Hintergrund noch Standortdaten bekommen?
 
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 ?
 
Ein ForegroundService muss dauerhaft eine Notification anzeigen. Damit der User sieht, dass da was passiert.
 
Du könntest dir einen Service basteln und den mit interval-mäßig dann neu starten , bevor ihn android tötet. (Heartbeat)
 
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.
 
  • Danke
Reaktionen: swa00 und jogimuc
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 ...
 
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.
 
Welche Optionen gibt es denn sonst noch?
 
Das wurde doch schon gesagt. ForegroundService.
Und das von deek ist wohl die beste Lösung.
[doublepost=1567770650,1567770516][/doublepost]Ein 30 sek tackt mit alarmmanager geht mit Sicherheit nicht.. Wie gesagt etwas 5 min.
 
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.
 
Wenn du den alarmmanager im Service immer wider neu startest also keine Auto
repesting schedule machst kann das villeicht gehen.
 
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.
 
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?
 
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()))
 
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.
 
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.
 
So war das auch von mir gemeint. Unter welchen bedingungen kann dieser Service denn beendet werden? Abgesehen davon, das der Nutzer in manuell beendet?
 
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.
 
  • Danke
Reaktionen: SlayNox
Okay super,
ich werde mir den WorkManager mal genauer anschauen. Ebenso die Optimizations.
 

Ähnliche Themen

BerndFfm
Antworten
0
Aufrufe
1.398
BerndFfm
BerndFfm
C
  • canna4u
Antworten
7
Aufrufe
846
swa00
swa00
L
Antworten
8
Aufrufe
1.281
jogimuc
J
Zurück
Oben Unten