Versändnisfrage - BroadCast, Service - Funktion - Lösung

  • Antworten:11
  • Bentwortet
Martin Grulich
  • Forum-Beiträge: 56

19.04.2011, 15:18:56 via Website

Hallo Leute,

ich habe inzwischen einige Zeit damit verbracht zu Googlen.

Erstmal zu meiner Situation.
Im grunde möchte ich zyklisch im Hintergrund prüfen ob neue Eintrage in einer externen Datenbank sind, die ich mir via JSON von einem http-Server hole.

Nun soll dies natürlich in erster Linie im Hintergrund geschehen, da dafür ja keine Interaktion vom Nutzer notwendig ist.
Hintergrundaktivitäten führe ich meines Wissen entweder mit einem Thread oder mit einem Service.

Nun möchte ich sowohl bei einem Neustart des Smartphones zyklisch im Hintergrund diese Abfrage durchführen, als auch nach Änderungen in den Einstellungen (z.B. Intervall oder ähnliches) diesen Service (neu) starten.

Bisher starte ich meinen Timer mit dem Alarmmanager (alarmManager.setRepeating) nach die Einstellungen geändert wurden.
Nur wie mache ich das aus meinem Broadcastreceiver heraus in Kombination eines "Service"es, den ich bis dato nicht verwendet habe, da ich dies bisher in einem Thread gelöst habe und ich mit dem Service bisher nicht gearbeitet habe und mir die ganzen Tutorials irgendwie nicht so recht weiterhelfen.

Danke & Gruß Martin

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

19.04.2011, 16:12:02 via Website

Es gibt mehrere Optionen. Eine davon:

Du trägst den Service im Manifest ein damit er beim Boot sofort loslegt. Dazu benötigt er einen IntentFilter. Der Service läuft autark von Deiner App, könnte wiederum einen Timer verwenden und kümmert sich dann zyklisch um das Abholen der Daten und das Verarbeiten der Daten (z.B. Datenbank?). Zugleich könnte der Service auch ein BroadcastReceiver sein damit man ihm veränderte Einstellungen mitteilen kann.

Der Service könnte einen Eintrag im NotificationBar anlegen über den dann eine bestimmte Activity Deiner App aktiviert werden könnte.

Activities Deiner App könnten wiederum BroadcastReceiver sein um Daten, die vom Service verschickt wurden, anzeigen zu können.

Das alles ist eigentlich nicht viel Arbeit und nicht übermäßig kompliziert. Man muß sich nur einmal zurücklehnen und überlegen was man eigentlich alles will und welcher App-Teil was machen soll. Alternativen gibt es zum Beispiel im Verwenden von Bindern (statt Broadcasts), im Starten des Service durch eine Activity statt durch das System, etc. etc.

Gruß
Harald

Antworten
Markus B.
  • Forum-Beiträge: 636

20.04.2011, 00:22:21 via Website

Hi,
ich habe mal ein kleines Remote Service Beispiel zusammen getippt.
Das Beispiel besteht aus einer Activity und einem RemoteService. Die Activity kann per Button den Service starten, stoppen und eine Variable vom Service abfragen. Alles in allem nichts wirklich wildes aber evtl. hilft es dir in die Materie besser einzusteigen.
Sollten sich fragen ergeben melde dich einfach :)

Gruß,
Markus

Antworten
Stefan S.
  • Forum-Beiträge: 560

20.04.2011, 11:08:10 via Website

Markus B.
Hi,
ich habe mal ein kleines Remote Service Beispiel zusammen getippt.
Das Beispiel besteht aus einer Activity und einem RemoteService. Die Activity kann per Button den Service starten, stoppen und eine Variable vom Service abfragen. Alles in allem nichts wirklich wildes aber evtl. hilft es dir in die Materie besser einzusteigen.
Sollten sich fragen ergeben melde dich einfach :)

Gruß,
Markus

Danke für deine Mühe! So was habe ich gesucht.

Antworten
Martin Grulich
  • Forum-Beiträge: 56

22.04.2011, 13:10:09 via Website

Nun habe ich ein wenig mit dem Servie rumprobiert und stehe nun vor folgendem Problem:

Ich habe in in meinem Service folgendes in der OnCreate stehen:
1@Override
2 public void onCreate() {
3 super.onCreate();
4 Log.d("MyApp", "Service created !");
5 /*preferences =
6 getSharedPreferences(
7 getPackageName()+"_preferences",
8 MODE_PRIVATE);*/
9 preferences =
10 getSharedPreferences(
11 getPackageName()+"_preferences",
12 MODE_PRIVATE);
13 Log.d("MyApp", "Service get Preference-Handler");
14 Boolean pref_auto_update = preferences.getBoolean("auto_update", false);
15 Integer pref_auto_update_interval = preferences.getInt("auto_update_interval", 10);
16 Log.d("MyApp", "Service getted Prefs");
17 INTERVAL = pref_auto_update_interval*1000;
Doch nach "Log.d("MyApp", "Service get Preference-Handler");" hängt sich die App weg und kommt nicht mehr dazu "Log.d("MyApp", "Service getted Prefs");" zu machen. Nur fine ich meinen Fehler nicht, hat jemand eine Idee ?

Danke & Gruß Martin

Antworten
Martin Grulich
  • Forum-Beiträge: 56

22.04.2011, 23:11:18 via Website

Hi der Stacktrace sieht folgendermaßen aus:
1DalvikVM[localhost:8611]
2 Thread [<3> main] (Suspended (exception RuntimeException))
3 ActivityThread.handleCreateService(ActivityThread$CreateServiceData) line: 2790
4 ActivityThread.access$3200(ActivityThread, ActivityThread$CreateServiceData) line: 119
5 ActivityThread$CreateServiceData(ActivityThread$H).handleMessage(Message) line: 1917
6 ActivityThread$H(Handler).dispatchMessage(Message) line: 99
7 Looper.loop() line: 123
8 ActivityThread.main(String[]) line: 4363
9 Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
10 Method.invoke(Object, Object...) line: 521
11 ZygoteInit$MethodAndArgsCaller.run() line: 860
12 ZygoteInit.main(String[]) line: 618
13 NativeStart.main(String[]) line: not available [native method]
14 Thread [<13> Binder Thread #2] (Running)
15 Thread [<11> Binder Thread #1] (Running)
16 Thread [<15> Timer-0] (Running)

Antworten
Markus B.
  • Forum-Beiträge: 636

22.04.2011, 23:18:28 via Website

Hmmmmm, das ist doch nicht der stacktrace des Fehlers ?
Ich hätte nun sowas in dieser Richtung erwartet:
104-22 23:06:29.814: ERROR/AndroidRuntime(2530): FATAL EXCEPTION: main
2 java.lang.RuntimeException: Unable to instantiate service com.example.MyServiceImpl: java.lang.NullPointerException
3 at android.app.ActivityThread.handleCreateService(ActivityThread.java:1929) .....

Interessant wäre es zu wissen wie du "preferences" initialisiert hast.
1preferences =
2 getSharedPreferences(
3 getPackageName()+"_preferences",
4 MODE_PRIVATE);

Das folgender Code bei mir funktioniert:
1final SharedPreferences preferences =
2 getSharedPreferences(
3 getPackageName() + "_preferences",
4 MODE_PRIVATE);


Gruß,
Markus

— geändert am 22.04.2011, 23:23:16

Antworten
Martin Grulich
  • Forum-Beiträge: 56

22.04.2011, 23:23:05 via Website

Wenn ich das mit einem Try-Catch umschiffe, kommt dabei folgendes raus:
104-22 21:22:12.691: DEBUG/EI112(245): java.lang.ClassCastException: java.lang.String

Antworten
Markus B.
  • Forum-Beiträge: 636

22.04.2011, 23:42:54 via Website

Okay, das könnte folgendes Problem sein:

Was genau speicherst du denn via SharedPreference ?
Mit diesem Mechanismus ist es z.B. nicht möglich Objekte (bezogen auf eigene Objekte), Byte-Arrays, Bilder, Fotos ect. zu speichern.
Wenn du dann dort z.B. ein Objekt speicherst, würde die ClassCastException Sinn ergeben.

Gruß,
Markus

— geändert am 22.04.2011, 23:43:59

Antworten
Martin Grulich
  • Forum-Beiträge: 56

23.04.2011, 00:06:14 via Website

An sich nichts nennenswerte,
da sind ein paar Checkboxen definiert, 2 ListPreferences und eine RingtonePreference.
1<?xml version="1.0" encoding="utf-8"?>
2<PreferenceScreen
3 xmlns:android="http://schemas.android.com/apk/res/android">
4 <PreferenceCategory
5 android:title="@string/txt_preferences_update_title">
6 <CheckBoxPreference
7 android:title="@string/txt_preferences_auto_update_title"
8 android:summary="@string/txt_preferences_auto_update_summary"
9 android:key="auto_update" />
10 <ListPreference
11 android:title="@string/txt_preferences_auto_update_interval_title"
12 android:summary="@string/txt_preferences_auto_update_interval_summary"
13 android:key="auto_update_interval"
14 android:entries="@array/auto_update_interval"
15 android:entryValues="@array/auto_update_interval_values"
16 android:defaultValue="10" />
17 </PreferenceCategory>
18 <PreferenceCategory
19 android:title="@string/txt_preferences_notification_title">
20 <CheckBoxPreference
21 android:title="@string/txt_preferences_notification"
22 android:summary="@string/txt_preferences_notification_summary"
23 android:key="notification" />
24 <CheckBoxPreference
25 android:title="@string/txt_preferences_update_sound"
26 android:dependency="notification"
27 android:summary="@string/txt_preferences_update_sound_summary"
28 android:key="update_sound" />
29 <CheckBoxPreference
30 android:title="@string/txt_preferences_update_vibrate"
31 android:dependency="notification"
32 android:summary="@string/txt_preferences_update_vibrate_summary"
33 android:key="update_vibrate" />
34 <RingtonePreference
35 android:title="@string/txt_preferences_ringtone"
36 android:key="Ringtone"
37 android:dependency="notification"
38 android:summary=""
39 android:ringtoneType="notification" />
40 </PreferenceCategory>
41 <PreferenceCategory
42 android:title="@string/txt_preferences_behavior_title">
43 <CheckBoxPreference
44 android:title="@string/txt_preferences_behavior_hide_read_title"
45 android:summary="@string/txt_preferences_behavior_hide_read_summary"
46 android:key="hide_read" />
47 <CheckBoxPreference
48 android:title="@string/txt_preferences_behavior_load_complete_title"
49 android:summary="@string/txt_preferences_behavior_load_complete_summary"
50 android:key="load_complete" />
51 <ListPreference
52 android:title="@string/txt_preferences_reports_max_count"
53 android:summary="@string/txt_preferences_reports_max_count_summary"
54 android:key="reports_max_count"
55 android:entries="@array/reports_max_count"
56 android:entryValues="@array/reports_max_count_values"
57 android:defaultValue="20" />
58 </PreferenceCategory>
59</PreferenceScreen>

Antworten
Markus B.
  • Forum-Beiträge: 636

23.04.2011, 01:42:21 via Website

Tja, dann weiß ich so nun auch nicht wirklich weiter ...
Kannst du mir dein Projekt irgendwie zukommen lassen via mail oder so ?

Gruß,
Markus

Antworten