Verhalten des Services nicht ganz klar

  • Antworten:5
S Zander
  • Forum-Beiträge: 12

18.08.2013, 20:42:19 via Website

Hallo Entwickler,

ich habe mich heute mal mit der Problematik Service beschäftigt, dazu habe ich mir, wie sollte es auch anders sein eine Dummy GPS Service gebastelt.

1public class gpsService extends Service {
2
3 GpsData gpsData = null;
4
5 private final IBinder gpsBinder = new GpsLocalBinder();
6
7 public class GpsLocalBinder extends Binder {
8 gpsService getService() {
9 return gpsService.this;
10 }
11 GpsData getGpsData (){
12 return gpsData;
13 }
14 }
15
16 @Override
17 public void onCreate () {
18 gpsData = new GpsData(System.currentTimeMillis(), 50.7066272f,7.1152637f,69.746456f);
19 }
20
21 @Override
22 public void onDestroy() {}
23
24 @Override
25 public IBinder onBind(Intent intent) {
26 return gpsBinder;
27 }
28
29 GpsData getGpsData() {
30 return gpsData;
31 }
32}


Wenn ich den Service in onResume() der MainActivity starte beendet sich die Applikation gleich.

1@Override
2 public void onResume() {
3 connect_gpsService();
4 }


wenn ich den Service jedoch in onCreate der MainActivity starte kommt es erst beim Beenden des Programms
zur Fehelermeldung.

eventuell noch die Initalsierung

1private gpsService localService;
2 private gpsService.GpsLocalBinder localServiceBinder;
3
4 private GpsData gps_position;
5
6 public ServiceConnection localServiceConnection = new ServiceConnection() {
7 @Override
8 public void onServiceConnected( ComponentName className, IBinder binder) {
9 localServiceBinder = (gpsService.GpsLocalBinder)binder;
10 localService = ((gpsService.GpsLocalBinder) binder).getService();
11 showMessage("GPS Service connected!");
12 }
13
14 @Override
15 public void onServiceDisconnected(ComponentName componentName) {
16 showMessage("GPS Service disconnected!");
17 }
18 };
19public void connect_gpsService () {
20 Intent intent = new Intent(getApplicationContext(), gpsService.class);
21 bindService(intent, localServiceConnection, Context.BIND_AUTO_CREATE);
22 }


Macht es für Android so einen Unterschied wann ich einen Service starte ?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.08.2013, 00:49:49 via Website

Gewöhnlich in onStart und onStop dann unbindService aufrufen.

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

Antworten
S Zander
  • Forum-Beiträge: 12

19.08.2013, 06:45:53 via Website

Hallo Mac,

Danke für deine schnelle Antwort. Eventuell habe ich die Frage auch nicht konkret genug formuliert. Wie ich das nun aus zwei Büchern und den Android Manuals verstanden habe ist ein Service nichts weiter wie ein Thread. Einen Thread kann ich zumindest in diversen anderen Sprachen an jeden Punkt der Applikation starten und stoppen. So sollte es kein Problem darstellen den Service auch bei onPause() mittels unbindService zu stoppen bzw. ihn an jeden Punkt der Applikation zu starten.

Gruß S

— geändert am 19.08.2013, 06:48:36

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.08.2013, 11:57:26 via Website

Ein Service wird auch nur vom Main Thread ausgeführt, du musst weiterhin einen Thread aufmachen damit du entkoppelst: Das steht in den Dev Guids gut beschrieben (What is a Service?):

http://developer.android.com/reference/android/app/Service.html

Oder du nutzt einen IntentService, diese sind aber gewöhnlich keine Bound-Services so das di mittel AIDL/Bindler drauf zugreifen kannst. Hier werden die Intents über einen (Handler-)Thread entkoppelt abgearbeitet (Queue). Bei einem eingenden Service musst du das selbst machen. Ansich kein Ding einen Exceutor und eine Queue aufzusetzen und dann diese abarbeiten zu lassen.

Hier mal wie das in Plain Java zu nutzen ist. Ein wenig nach Android Adaptieren muss man das zwar, futzt aber gut (Selbst oft genug gemacht): http://howtodoinjava.com/2012/10/20/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/

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

Antworten
S Zander
  • Forum-Beiträge: 12

31.08.2013, 10:14:39 via Website

Hallo,

nun habe ich mal wieder einen Abend Zeit gefunden und habe mich nochmal des Service Problem angenommen. Ich habe mir nochmals den DEV Guide für Service durch gelesen und diesmal allen andere "nützlichen" Hinweise aus Internet usw. weggelassen. Und siehe da, plötzlich funktioniert es.
Der Service startet brav bein onStart und wird bei onStop beendet und tut genau das was er soll.

Danke nochmal an MAC für den Hinweis - es hat sich mal wieder bewahrheitet wer lesen kann, ist klar im Vorteil.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

31.08.2013, 14:17:19 via Website

Du musst halt aufpassen,die Google Android Docs sind _DIE_ Referenz, keine Halbwahrheiten die so im Umlauf sind ;) Ich würde mir zwar einige weitere Details seitens Google wünschen aber es wird immer besser und ja es gibt ja noch _Brain_, das nutz ich auch gerne und komme selbst zu einer Lösung damit.

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

Antworten