background service

  • Antworten:16
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 16:30:50 via Website

hallo

ich möchte einen service implementieren, der einmal täglich etwas in die datenbank speichert.

solange meine app läuft, funktioniert alles wunderbar, jedoch wenn die app weg ist, dann kann ich die datenbank nicht mehr benutzen.

übergebe sogar das db objekt dem service, aber es funktioniert einfach nichts mehr.
fehlermeldungen gibt es keine. der service gibt wohl gar nichts her.

irgendwelche ideen, wie ich das lösen kann?

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 16:40:10 via Website

Wie übergibst du denn dem Service das DB Object ? Per AIDL Interface ?

Ansich wird die DB z.b über einen SQLiteOpenHelper angelegt, man erbt einfach von diesem und impl. die entsprechenden Methoden.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 17:12:55 via Website

hallo

ich habe einfach in meiner service klasse ein statisches SQLiteDatabase Object

das setze ich über die statische setDB method - aber das fruchtet leider gar nicht.

kann ich überhaupt auf die db zugreifen, wenn die app selbst nicht läuft? ich hoffe mal schon

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 17:21:12 via Website

Soweit ich das verstanden habe geht das so nicht:

Android verwaltet die Services selbst, beendet diese wenn nötig und startet diese auch selbständig.
Daher ist meine Annahme das der Service in einer Extra VM rennt. Was wiederum auch begründet wieso es AIDL gibt. Bei deinem Ansatz vermute Ich das du zwar die statisch Variable setzt aber halt nicht in der richtigen VM.

Aber solltest du nicht eine NullPointerException bekommen wenn du mit dem Datenbank Objekt arbeitest ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 17:23:16 via Website

also wirklich eine exception bekomme ich nirgends angezeigt, aber ich vermute auch, dass es eine nullpointer exception gibt, da er genau bei der ersten verwendung des db objektes abstürtzt.

nur halt leider ohne jegliche meldungen. aber wird sicher so sein

dh mit diesem aidl kann ich das dann lösen?

swordiApps Blog - Website

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

01.10.2009, 17:33:31 via Website

Hi Markus,

also wenn Du eine NullPointer Exception kriegst ... dann wird diese SICHER im Logcat angezeigt und Du kriegst auf dem Screen die typische force close Meldung.

Ich nehm mal an das bekannt ist wie Du an die Logcat Ausgabe herankommst.

lg
Voss

lg Voss

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 17:41:09 via Website

hey
klar, ich weiß schon, wie das alles geht,

aber beim background service kommt da rein gar keine meldung, hört einfach auf. denke mal das ist bei allen so?

swordiApps Blog - Website

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

01.10.2009, 17:47:45 via Website

Hallo Markus,

ich vermute, dass Dein Service gestoppt wird sobald Du Deine App bzw. die Activity mit Home oder Back beendest.

WEnn Deine APP läuft über:
adb shell
ps

Nun solltest Du 2 Prozesse laufen haben .. 1 Activity & 1 Service

Jetzt beendest Du die App und schaust wieder mit ps

Ist der Service noch da ?

Es gibt eine Möglichkeit das Service verhalten zu beeinflussen ...
http://developer.android.com/guide/topics/manifest/service-element.html

1<service android:enabled="true"
2 android:name=".CallListener">
3 </service>

Normalerweise ist das default auf true .. ich musste es allerdings bei mir explizit setzen.

Dazu gehörte allerdings auch, das ich im Manifest in der Activity folgendes einbaute:
1android:launchMode="singleTask"

Dies beides zusammen hat bei mir erst den Service im Hintergrund sauber laufen lassen und bei neustart der App sich wieder in den richtigen Prozess eingehängt.

lg
Voss

lg Voss

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 18:02:39 via Website

danke schonmal für deine hilfe.

also der service wird sicher gestoppt.

also beim starten des services wird eine method aufgerufen, die alle X secunden dann etwas macht.

in der method wird alles gemacht, bis ich das erste mal auf das db object zugreift, das wird wohl null sein, deshalb wird abgebrochen.

der service läuft aber weiter und ein paar sek. später wird die methode wieder aufgerufen.

die offene frage ist also, wie kann ich auf die datenbank zugreifen, obwohl meine app im hintergrund nicht mehr läuft. muss ja irgendwie gehen, sonst wäre das ja völlig blöd

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 18:07:55 via Website

Erweitere den SQLiteOpenHelper der den Zugriff kapselt.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

01.10.2009, 18:17:54 via Website

Das wollte ich eigentlich auch vorschlagen .. :)

lg
Voss

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 18:21:51 via Website

Hatte das vorher ja schon gesagt.

PS: Ich finde es unschön den Service statisch zu starten, aber das ist erstmal nebensächlich.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 18:27:54 via Website

sorry, aber ich steh auf der leitung

was nützt es mir, wenn ich den sqlitehelper erweitere, aber im service nicht auf die db zugreifen kann?

da check ich etwas gar nicht leider

gibts da irgendwo beispiele dazu ?

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 18:32:04 via Website

Bsp: http://code.google.com/p/windroid/source/browse/trunk/src/de/macsystems/windroid/db/Database.java

Die Klasse kapselt den Zugriff, woher hier die Datenbank kommt ist vollkommen egal. Ist sie nicht vorhanden wird sie angelegt und onCreate wird aufgerufen ändere Ich die Versions Nummer springt er in die onUpgrade Methode.

Hth,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 18:35:06 via Website

ja aber auch diese klasse kann ich ja nicht ohne weiteres dem service übergeben.

das löst ja mein problem nicht oder?

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

01.10.2009, 18:37:08 via Website

Du denkst falsch drüber nach und liest die API doc nicht!


A helper class to manage database creation and version management. You create a subclass implementing onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

For an example, see the NotePadProvider class in the NotePad sample application, in the samples/ directory of the SDK.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

01.10.2009, 18:52:06 via Website

danke für deine geduld ;)

ich werde mich morgen nochmal damit beschäftigen, heute geht wohl gar nichts mehr, schon zu lange dabei

swordiApps Blog - Website

Antworten