Messenger App: Service - App Kommunikation

  • Antworten:8
  • Bentwortet
LitteM
  • Forum-Beiträge: 141

16.12.2014, 18:10:25 via Website

Hallo zusammen,

ich habe vor einer Weile mit einem Freund zusammen angefangen einen eigenen Instant-Messanger mit Verschlüsselung zu schreiben. Die Serverseite ist auch selbst geschrieben und läuft wunderbar. Ich bin mir aber in einem Punkt noch nicht so wirklich sicher wie ich es schlussendlich realisieren soll: Die Kommunikation des background-service mit den verschiedenen (jeweils aktiven) Activities.

Generell kann gibt es für mich vier verschiedene Fälle:
1) App aus
2) App im Hintergrund
3) "Main View" der App
4) Chat-Fenster-View

Ich würde gerne, dass egal welcher Fall ansteht eine entsprechende Komponente die Nachricht vom Service aufnimmt und entsprechend verarbeitet. Zum Testen hatte ich bisher einfach einen ResultReceiver verwendet den ich in der Chat-View Activity gestartet hatte. Damit ließen sich aber soweit ich es verstanden habe nicht alle Fälle gescheit abdecken/gut realisieren. Wenn ich einen bound service nehme, dann wird dieser ja beendet sobald der letzte Client das unbind ausführt. Damit wäre der Service dann auch tot sobald die app aus ist?

Vielleicht hat mir jemand einen Tipp was für meine Zwecke am besten wäre. Vielen Dank für Hilfe/Ratschläge im Vorraus. Falls weitere Daten/Info's benötigt werden reiche ich diese asap nach :)

Grüße

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

16.12.2014, 18:29:17 via Website

Hallo LitteM.

Wie bekommst du denn die Daten? Über TCP/listener?

Somit: Ein Service kann im Hintergrund offen gehalten werden. Über einen Broadcast Reciver kannst du dann z.b. den Start Event mitbekommen und deinen Service beim Systemstart auch starten lassen. Sobald eine Nachricht kommt musst du sie entsprechend verarbeiten.
1. Wenn die App aus ist eine Systemnotification erzeugen und auf die Nachricht hinweisen.(evntl. intetn auf app + gleichzeitiger Sprung auf den Kontakt ChatView)
2. Wenn die App offen ist dann die Nachricht einem Kontakt zuordnen und über einen Event bzw. Callback etc. die nachricht bei diesem Kontakt erscheinen lassen. Wenn gerade das chatfenster mit dem kontakt offen ist muss dies auch bemerkt und die nachricht gleich angezeigt werden.

LG

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

LitteM

Antworten
LitteM
  • Forum-Beiträge: 141

16.12.2014, 18:44:25 via Website

Die Daten kommen via TCP über einen Socket der im Service steckt.

Meinst du mit den Systemnotifications die Pop-ups in der bar am oberen Rand? Wenn ja, sowas habe ich im Service schon einmal testhalber implementiert gehabt (hat damals funktioniert - aber das ist schon eine Weile her. Hatte ich dann mal auskommentiert). Wäre natürlich eine Lösung für das app-aus-szenario. (Dann muss ich aber jedes Mal nachprüfen ob die app aktiv ist bzw ich mich gerade nicht im chat-window befinde?)

Der Service bekommt vom server alle daten (from, timestamp, content etc). Also würdest du mir raten das über zB einen Broadcastreceiver zu machen? Kann ich dann einfach zwei Receiver für jeweils die Ebene "MainView" und "Chat-Fenster" erstellen? Es ist das erste Mal, dass ich etwas mit einem Service zu tun habe. Gelesen habe ich schon einiges, aber ich bin noch leicht verwirrt ;)

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

16.12.2014, 19:00:23 via Website

Nein das mit dem Broadcast REciver war nur für den Systemstart .
Wenn du einen Service hast kannst du das ganze direkt aus diesem machen.
Du brauchst halt eine Methode der du deine nachricht übergibst und die dann zugeordnet wird.
Dann muss der Service infos zu deiner App sammeln und auswerten denn :
1. der Scervice muss wissen ob die App gerade läuft wenn dein dann sys Notification.
2. Wenn die App läuft dann die nachricht einem Kontakt zuordnen
2.1 Wenn die nachricht einem Kontakt zugeordnent ist muss deine Chatlogik merken ob das Chatfenster des betreffenden gerade offen ist oder nicht und wenn ja dann dich nachricht anzeigen, wenn nein bis zum aufruf des chatfensters waren und dann anzeigen (oder zwischenspeicher damit anzeige und reciver logisch voneinander getrennt sind)
LG

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

LitteM

Antworten
LitteM
  • Forum-Beiträge: 141

16.12.2014, 19:22:01 via Website

Zu 1) Das bekomme ich sicher so hin :)
Zu 2) Wird eigentlich indirekt gemacht da ich ja die "Kontaktdaten" mit der Message vom Service rausschicken kann
Zu 2.1) Ich tue mich noch schwer damit zu verstehen, wo ich solch eine Logik dann implementieren soll. Ich habe in meiner App drei Tabs. Wenn ich mich beispielsweise im Chat-Fenster befinde, dann sind die anderen Activities (zB mein MainView der aus diesen drei Tabs besteht) nicht aktiv bzw weg? Und wenn ich im MainView bin, dann ist ja die Activity für das Chat-Fenster nicht vorhanden. Ich stehe gerade total auf dem Schlauch, tut mir Leid...Wäre toll wenn du mir da etwas auf die Sprünge helfen könntest :/

Danke schonmal für die schnellen Antworten!

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

16.12.2014, 20:18:12 via Website

Ohne deinen Code zu kennen lässt sich da kaum etwas sagen.
Normalerweise hat man seine Objektlogik von der UI getrennt sodass die Logik eigensttägdig agieren kann und dazu nicht die UI benötigt.
Ich würde es mal so sagen: (Ich weiss nicht wie du eine Objekte etc. strukturiert hat aber als beispiel sollte es reichen):
Du hast einige Logik Klassen z.b. Kontakt,Nachricht,Chat usw.
Beschränken wir uns nur mal auf diese.

Ich würde es so realisieren:
Bei deinem Service kommt eine Nachricht an diese wird in ein NachrichtenObjekt geparst etc.
Dann wird dann per Event der Klasse Kontakt übergeben wleche dann die entsprechende nachricht an den entsprechenden Kontakt verweist und diese auch per Event [In Java sagt mam besser Callback über ein interface] weitergibt.
So kannst du die nachricht immer weiter duchhangeln und brauchst auf der UI noch garnichts davon wissen.
Erst im letzten schritt wenn die nachricht am "Zielort" angekommen ist setzt du ein Callback auf die UI welches dann den ensprechenden Text in das Chatfenster schreibt oder halt irgendwie anders anzeigt (falls in der mainView)

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

LitteM

Antworten
LitteM
  • Forum-Beiträge: 141

16.12.2014, 20:59:03 via Website

Um das ganze hier nicht der Länge nach aufzublasen habe ich dir mal eine Nachricht geschickt.

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

16.12.2014, 21:11:17 via App

mach hier einfach weiter wir haben kein Thread längenlimit (mehr);) (Das gab es früher mal..)

LG

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

LitteMAndy N.

Antworten
LitteM
  • Forum-Beiträge: 141

16.12.2014, 22:43:25 via Website

Hm, ich hab den Wald wohl vor lauter Bäumen echt nicht gesehen. Habe es jetzt hinbekommen. Das mit den Notifications war super easy - funktioniert wunderbar.

Habe dann im Service eine Methode geschrieben die mir prüft welche Klasse gerade onTop-angezeigt wird. Falls es die Chat-Window-Klasse ist, dann gibts statt der Notification nen Intent Broadcast den ich dann in der Chat-Window-Klasse empfange.

Danke nochmal dafür :D

Jetzt muss ich nur noch für ein paar userdaten vom service auf die sqlite db zugreifen können und dann ist die größte Hürde gemacht :)

Antworten