Service per AlarmManager und startWakefulService

  • Antworten:15
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 00:55:49 via Website

Hallo Spezialisten,

ich habe mir einen Service geschrieben der über den Alarmmanager und per startWakefulService gestartet wird.
Mein Service läuft unter Umständen länger und komplett im Hintergrund. Klappt im Prinzip gut. Eigentlich.
Aber:
Mein Service nutzt dabei das GoogleDriveApi und das OpenPgpApi.
Jetzt scheint es so zu sein das Android irgendwann wenn mein Service noch fleißig am ackern ist (und dabei immer wieder das GoogleDriveApi und OpenPgpApi nutzt) die Prozesse (oder wie soll ich es nennen) die hinter GoogleDriveApi/OpenPgpApi stehen beendet.
Sieht im Logfile zB so aus:
I/ActivityManager( 1004): Process org.sufficientlysecure.keychain.debug (pid 14781) has died
Logischerweise kracht dann der nächste Aufruf des OpenPgpApi und mein Service wird auch beendet.
Analoges gilt für das GoogleDriveApi.

Jetzt frag ich mich wie kann ich verhindern das Android durch Beenden der aktiv genutzten API's meinem Service die Füße wegzieht?
Danke schon mal für Tipps.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 10:42:44 via Website

Hallo,

so wie du das interpretierst ist das noch nich richtig.
Das Android OS beendet nich die API, denn davon weiss "es" nichts.
Es beendet den Service, da dieser seiner Meinung nache nich mehr gebrauchst wird nur nur Ram "frisst".

Was du brauchst ist ein BackgroundService (persistant), welcher imer läuft und vom System nicht automatisch beendet werden kann.
Hier nochmal zum nachlesen:
http://stackoverflow.com/a/14748123

Und zu persistant Services: http://devescape.blogspot.de/2011/02/persistent-services-in-android.html

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 10:50:04 via Website

Anmerkung meiner Seits:

Aus eigener Erfahrung wäre ein AsyncTask nicht zielführend, da diese nur für kurze Tasks zu gebrauchen sind.

Antworten
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 11:20:52 via Website

Alles richtig.
Was ich als API das beendet wird bezeichnet habe mag auch ein Service sein, der von meinem Service durch die entsprechenden API-Aufrufe gestartet wird. Die Persistenz dieser zusätzlichen "API-Services" kann ich aber nicht beeinflussen, oder?

Mein Service wird über den Alarmmanager (OnAlarmReceiver-startWakefulService-completeWakefulIntent) gestartet und wird ja auch nicht durch den ActivityManager beendet.
Die beiden anderen "Services" (OpenPgpAPI,GoogleDriveAPI) aber an die mein Service sich "bindet" werden aber mitten in der Nutzung vom Alarmmanager irgendwann beendet. Was mittelbar meinen Service dann auch nicht mehr arbeiten lässt.

Das kann doch nicht sein das Android Services die gerade in Benutzung sind einfach beendet, das würde ja jede Nutzung zum Glückspiel machen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 11:25:47 via Website

Wie gesagt, du musst den Service als background und persistant dekalrieren.
Wie man das macht, da bin ich leider überfragt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 11:26:09 via Website

Doch das ist so, zur Sicherheit. Wie Pascal beschrieben hat, werden Threads beendet, welche zu viel RAM benötigen.

Antworten
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 11:51:50 via Website

Ok. Nochmal zum mitschreiben:
Mein Service nutzt mittels GoogleDriveAPI einen zweiten "Service", nenn ich jetzt mal GoogleDriveService.
Habe ich also zwei Services die miteinander arbeiten.
Mein Service lädt angenommen 100 Dateien mittels GoogleDriveService auf Google Drive hoch, eine nach der anderen.
Irgendwann beschließt das OS den GoogleDriveService zu beenden, obwohl mein Service erst bei Datei 27 angekommen ist.
Wie soll man denn da 100 Dateien hochgeladen bekommen?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 11:55:38 via Website

Ich vermute eher dass das OS nur deinen Service zerschießt und daraus resultieren der Google Drive Service auch geschlossen wird.
Aber ist das aus der GoogleDriveAPI wirklich ein Servie?
Wenn ja dann könntest du diesen ja auch irekt aus deinen Activities ansteuern ohne dass du nen extra Service hast, denn ich glaube nested Services sind nicht so gut..

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 12:03:38 via Website

Kann es sein das du zwar redest aber keine Ahnung hast?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:05:41 via Website

Gefährliches Halbwissen :P
Denn ich habe noch nie mit der Google Drive API gearbeitet.
Aber Services müssen so angelegt werden können, dass sie nicht vom OS zerstört werden.
Dies gilt auch für die GoogleDrive Api etc

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:11:17 via Website

Ich würde, auch mit Halbwissen, Pascals Aussage bestätigen.

Ohne Grund wird der Service nichts beendet, du musst jetzt also verhindern, dass es getan wird.

Pascal P.

Antworten
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 17:30:20 via Website

Gut, dann wiederhole ich nochmal meine Frage aus dem ersten Post:

Wie kann ich verhindern das Android durch Beenden der aktiv genutzten API's meinem Service die Füße wegzieht?

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 17:32:42 via Website

Indem du den ganzen Kram als BackgroundService laufen lässt.

Siehe im ersten Post von Pascal.

Antworten
Eisenhelm
  • Forum-Beiträge: 6

11.02.2016, 18:03:26 via Website

Mein Service ist persistant, der ist auch nicht das Problem.
Das Problem sind die Services, Prozesse, Threads, was auch immer das ist, die per API (GoogleDrive,OpenPGP) genutzt werden.
Auf die habe ich in Bezug auf Persistenz keinen Einfluss. Oder?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 18:11:17 via Website

Steht dazu in der API Beschreibung nichts?
Welche API enutzt du denn?
Wenn ich mir das (https://developers.google.com/drive/v2/reference/) anschaue, dannn ist da kein Service sondern urls die du direkt aus deinem Service ansteuern kannst.

Und per Drive API lädst du den File auch direkt und nich über einen 2. Service oder sehe ich da was falsch?
https://github.com/googledrive/android-demos/blob/master/app/src/main/java/com/google/android/gms/drive/sample/demo/RetrieveContentsActivity.java

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten