Verständnisfragen rund um Services

  • Antworten:5
Spike Spiegel
  • Forum-Beiträge: 5

25.06.2010, 16:05:22 via Website

Hallo AndroidPIT'ler,
ich bin nicht nur ein Neuling in diesem Forum sondern auch wenn es darum geht auf Android zuprogrammieren.

So kommen wir aber erstmal zu meinem Programm und dessen Grundidee. Wenn man mein Programm auf seine Grundpfeiler herunter bricht geht es darum das man über eine Socket-Verbindung Daten bzw. Nachrichten auf Byteeben senden und empfangen kann. Fürs senden und empfangen gibt es halt verschiedene Activities.

Daher wäre es wohl sinnvoll das jeder dieser Activities zugriff auf meine Verbindungsschnitstelle hätte. Daher wäre so nen Nebenläufiger Prozess keine schlechte Idee, wo sich einfach jeder dran bedienen könnte der gerade was braucht. Und fürs Response wäre es mir am liebsten wenn der Service auch noch zugriff auf mein Response Activity hätte. Damit er halt zur Laufzeit den angezeigten Inhalt verändern kann.

So und nun kommen mir so langsam ein paar Fragen auf, ist das so an sich überhaupt schlüssig und macht es so Sinn? Wäre nen Service die richtige Wahl oder sollte ich mich nach was anderem umschauen. Es wäre halt wichtig das dieser Prozess einmalig existiert und durch meine ganze Activitie-Kette verfügbar ist.

Ich wäre mehr als erfreut wenn Ihr mir bei meiner derzeitigen Blockade helfen könntet.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

25.06.2010, 16:17:07 via Website

Hallo,

ein Service ist z.b nur einmalig vorhanden, auch wenn du ihn zig mal startest!

Was du mit ResponseActivity meinst ist mir unklar, es können sicher an vielen stellen Daten empfangen werden! Daher gibt es wohl nicht DIE ReponseActivity, oder verstehe ich da was falsch ?

Fürs senden und empfangen gibt es halt verschiedene Activities.
Das kommt doch sehr auf die Anwendung drauf an, vieles kann auch im Hintergrund geladen werden und in eine DB geschrieben werden. Gerade mit Ladezeiten kann man den User sehr nerven, ich würde also die "IO - Tasks" die der User explizit anfordert mit den Activitys verbinden (anderes Thema). Also Buttons wo "Update" draufsteht sind sicher ein kandidat über einen Task der Rückmeldung an den User bringen muss!

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

Antworten
Spike Spiegel
  • Forum-Beiträge: 5

25.06.2010, 16:33:36 via Website

Mit Response Activity meinte ich ansich nur die Darstellung der Nachricht die ich Empfangen habe, dafür hab ich halt ein gesondertes Frame.

Du meintest das ein Service nur einmalig existiert, heißt das nun wenn x Activities meinen Service starten alle eine Referenz auf den gleichen haben oder wird der alte gelöscht und ein neuer an seiner Stelle erzeugt.

Es war halt ansich geplant das mein User die jeweiligen Bytes bzw. Bits frei nach belieben setzen kann, dadurch wird halt das Fenster zum setzen des Request doch schon etwas überladen sein. Daher wollte ich halt das Empfangen der Nachrichten auslagern und dort wollte ich dann die Nachricht je nach Request aufbereiten.

Und ich wollte mich jetzt noch nicht ganz in DB einarbeiten, da ich etwas "kurzer" Zeit schon mal meinen ersten Prototypen aufsetzen kann. Denn fürs IO steht schon alles fertig bereit, funktionniert auch alles wie geplannt. Jetzt ist halt nur noch eine grafische Aufbereitung von nöten.

So hab ich nun auch nen Fenster zum setzen der Verbindungseinstellung, somit müssen halt alle User Eingaben (sei es Einstellungen oder erstellen des Request) zu einem Handler geführt werden.

Hoffe ich habs nun nicht so verwirrt rübergebracht =]

Antworten
Spike Spiegel
  • Forum-Beiträge: 5

25.06.2010, 17:56:51 via Website

Ich hab auch gerade mal probiert das Bsp. aus dem Buch "Android - Grundlagen und Programmierung", was ja gerade als PDF frei zuladen gibt, nach zuprogrammieren.

Aber sobald ich die Daten aus dem Service abrufen will bekomme ich einen NullPointerException :\

1public class LocalService extends Service {
2 private final IBinder mBinder = new LocalBinder();
3
4 public class LocalBinder extends Binder{
5 LocalService getService(){
6 return LocalService.this;
7 }
8 }
9
10 @Override
11 public void onCreate() {}
12
13 @Override
14 public void onDestroy() {}
15
16 @Override
17 public IBinder onBind(Intent intent) {
18 return mBinder;
19 }
20
21 String getData(){
22 return "Data Service";
23 }
24}

1public class MainActivity extends Activity {
2 private LocalService mBoundService;
3
4 private TextView textView_Data;
5
6 private ServiceConnection mConnection = new ServiceConnection() {
7 @Override
8 public void onServiceConnected(ComponentName name, IBinder binder) {
9 mBoundService = ((LocalService.LocalBinder) binder).getService();
10 }
11
12 @Override
13 public void onServiceDisconnected(ComponentName name) {
14 mBoundService = null;
15 }
16 };
17
18 @Override
19 public void onCreate(Bundle savedInstanceState) {
20 super.onCreate(savedInstanceState);
21 setContentView(R.layout.main);
22 connectWithService();
23 textView_Data = (TextView) findViewById(R.id.TextView_Data);
24 getData();
25 }
26
27 private void connectWithService() {
28 Intent intent = new Intent(getApplicationContext(), LocalService.class);
29 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
30 }
31
32 public void getData() {
33 textView_Data.setText(mBoundService.getData());
34 }
35}

Dadurch bin ich nun noch verunsicherter als vorher.

Wüsstet Ihr vllt noch eine Bezugquelle wo mir Services nahegelegt werden könnten, habe zwar auch schon in der Droid Api nachgelesen aber sie hat mir nun auch nicht die gewünschte Erkenntnis gebracht.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

26.06.2010, 14:10:21 via Website

Dann hast du aber nicht zu ende gelesen: Context#startService ist aufzurufen um eine Verbindung über eine ServiceConnection herzustellen!
Allerdings ist der Aufruf von startService Asynchron, deine getData() Methode wird zwar hier funtzten, echten zugriff auf einen Service hast du aber erst nachdem onServiceConnected durchlaufen wurde!

hth,
Mac

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

Antworten
Spike Spiegel
  • Forum-Beiträge: 5

26.06.2010, 17:48:08 via Website

Ja vielen Dank Mac Systems, besonders für die schnelle Hilfe.

Hab ich doch wirklich bei meinem Prototyp nicht drauf geachtet das die onServiceConnected erst nacher aufgerufen wurde O.O

Konnte jetzt auch den Service so einbinden wie ich es mir vorher gedacht habe.

Nochmals vielen Dank =]

Antworten