Ich habe einen Dienst erstellt, der Daten aus dem Web in einem Hintergrundthread synchronisiert und eine Listenaktivität benachrichtigen möchte, wenn der Dienst abgeschlossen ist, damit der Cursor aktualisiert werden kann. Was wäre der beste Weg, dies zu tun? Ich denke daran, eine Sendung zu senden, wenn der Dienst fertig ist, aber ich bin mir nicht sicher, ob das der beste Weg ist. Ich muss den Cursor erneut fragen, wenn der Dienst beendet ist, also bin ich mir nicht sicher, ob das gut mit Rundfunkempfängern funktioniert? Ich habe nicht viele Android in einer Weile so vielen Dank im Voraus.
Verwenden Sie in Ihrem Dienst ein Handler
, das einen Client registriert, wenn Ihr ListActivity
eine Verbindung mit dem Dienst herstellt. Das bedeutet, dass Sie in Ihrer onServiceConnected
-Methode in ListActivity
einen Message
an Ihren Dienst senden, mit dem Sie die Verbindung zu verbundenen Clients verfolgen können. Dann kannst du einfach diese Clients in deinem Service
durchlaufen und ihnen ein Message
senden, wenn etwas in deinem Service
passiert, über das du deinem ListActivity
mitteilen willst. Für weitere Informationen können Sie sich Code in einem laufenden Projekt von mir ansehen: my ListActivity
und meine Service
stub .
Kurz gesagt, starten und binden Sie in Ihrem MainActivity
Ihren Dienst mit:
Definieren Sie einen Messenger, um auf Nachrichten vom Service zu antworten:
%Vor%Und schreiben Sie dann Ihren Dienstverbindungscode wie folgt:
%Vor% Beachten Sie, dass replyTo
der Messenger ist, den wir gerade erstellt haben.
Behalten Sie in Ihrem NetworkService
den Überblick über verbundene Clients mit:
und erstellen Sie Ihren Handler wie:
%Vor% Wenn Sie dann eine Nachricht an Ihre MainActivity
zurücksenden möchten, tun Sie Folgendes:
Wenn Sie bereits die Support-Bibliothek verwenden, können Sie genauso einfach eine Broadcast-Nachricht vom Dienst senden, indem Sie die LocalBroadcastManager zurück zu Ihrer Aktivität, die auf die gesendete Sendung wartet.
Durch die Verwendung von Local BroadcastManager wird sichergestellt, dass nur Ihre eigene Anwendung die Übertragung erhält, sodass Sie sich keine Sorgen über das Lecken privater Daten oder das Öffnen potenzieller Sicherheitslücken machen müssen.
Siehe auch: Verwendung von LocalBroadcastManager?
BEARBEITEN (09/2014):
Ein besserer Weg wäre ein Ereignis-Bus-Framework wie Otto (mein Favorit) oder GreenRobot/EventBus , um eine zu enge Kopplung Ihrer Komponenten zu vermeiden.
Wie in Der Leitfaden für erfahrene Programmierer zur fortgeschrittenen Android-Entwicklung
Ein Event-Bus ist eine großartige Möglichkeit für den Service, andere Teile zuzulassen von der App wissen, dass bestimmte Arbeit geleistet wurde. Es bietet einen Standard Kommunikationskanal (oder "Bus"), der Ereignishersteller und Ereignis Verbraucher können sich einhaken. Event-Produzenten müssen lediglich die Veranstaltung abgeben zum Bus; Der Bus wird die relevanten Ereignisse ansteuern Verbraucher. Dies reduziert die Kopplung zwischen den Herstellern und Verbraucher, manchmal sogar die Menge an Code zur Quelle benötigt und versenke diese Ereignisse.
Tags und Links android android-service android-cursor