Android Update Activity UI vom Dienst
Ich habe einen Dienst, der die überprüfung für die neue Aufgabe, die ganze Zeit. Wenn es eine neue Aufgabe, ich will aktualisieren Sie die Aktivität UI um zu zeigen, dass info.
Ich habe https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ diesem Beispiel. Ist das ein guter Ansatz weiter ? Andere Beispiele dafür?
Dank.
InformationsquelleAutor der Frage user200658 | 2013-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Siehe unten für meine ursprüngliche Antwort - das Muster hat gut funktioniert, aber vor kurzem habe ich angefangen mit einen anderen Ansatz, um Service - /Aktivitäts-Kommunikation:
Referenz auf den Service, so dass direkte Gespräche auf, sondern
als die Verwendung von Intents.
Verwenden RxJava für die Ausführung von asynchronen Operationen.
Wenn der Dienst muss weiterhin im hintergrund-Operationen, selbst wenn keine
Aktivität ausgeführt wird, starten Sie den Dienst aus der Anwendung
Klasse, so dass es nicht gestoppt, wenn ungebundene.
Die Vorteile, die ich gefunden habe, ist bei diesem Ansatz im Vergleich zu den startService()/LocalBroadcast Technik sind
Einige Beispiel-code. Zuerst der service:
Und eine Tätigkeit, die an den Dienst bindet und erhält Druck-Höhe-updates:
Layout für diese Tätigkeit ist:
Wenn der service muss im hintergrund laufen, ohne eine gebundene Tätigkeit, die er gestartet werden kann von der Application-Klasse als auch in
OnCreate()
mitContext#startService()
.Meine Ursprüngliche Antwort (von 2013):
In Ihren Dienst: (mit COPA als service im Beispiel unten).
Verwenden LocalBroadCastManager. In Ihrem Dienst onCreate, einrichten der Sender:
Wenn Sie möchten, Benachrichtigen Sie die UI etwas:
In Ihre Tätigkeit:
Erstellen eines Listeners, der auf onCreate:
und registrieren Sie es in onStart:
InformationsquelleAutor der Antwort Clyde
für mich die einfachste Lösung war so senden Sie ein broadcast, in der Aktivität oncreate ich habe mich registriert und definiert die broadcast-wie hier (updateUIReciver ist definiert als eine Klasse-Instanz) :
Und von dem service, den Sie senden die Absicht wie diese:
vergessen Sie nicht, um die Registrierung wiederherstellen, die in die Aktivität auf und zerstören :
InformationsquelleAutor der Antwort Eran Katsav
Ich mit einem gebunden-service zu tun und mit ihm zu kommunizieren durch die Implementierung einer listener in meiner Tätigkeit. Also, wenn Sie Ihre app implementiert myServiceListener, können Sie registrieren sich als listener in Ihren Dienst, nachdem Sie gebunden haben, rufen Hörer.onUpdateUI von Ihrem gebundenen service und update UI!
InformationsquelleAutor der Antwort psykhi
Ich würde empfehlen, Check-out Ottoein EventBus speziell für Android. Ihre Tätigkeit/UI hören können Veranstaltungen gepostet, die auf den Bus aus dem Dienst, und entkoppeln sich vom backend.
InformationsquelleAutor der Antwort SeanPONeil
Clyde ' s Lösung funktioniert, aber es ist eine Sendung, die ich bin mir ziemlich sicher, dass es weniger effizient ist als der Aufruf einer Methode direkt. Ich könnte mich irren, aber ich denke, die Sendungen sind dazu gedacht, mehr für die inter-application communication.
Ich nehme an, Sie wissen bereits, wie zu binden eine Dienstleistung, die mit einer Aktivität.
Ich mache etwas in der Art, wie Sie den code unten, um mit dieser Art problem umzugehen:
Ließ ich bits für die thread-Sicherheit, die unerlässlich ist. Stellen Sie sicher, zu sperren oder so etwas wie, dass bei der Prüfung und mit oder ändern Sie das fragment verweist auf die service.
InformationsquelleAutor der Antwort Reynard
InformationsquelleAutor der Antwort Mohammed Shoeb
Meine Lösung ist vielleicht nicht die sauberste, aber es sollte funktionieren ohne Probleme.
Die Logik ist einfach, erstellen Sie eine statische variable zum speichern Ihrer Daten auf der
Service
und aktualisieren Sie Ihre anzeigen in jeder Sekunde auf IhrenActivity
.Lassen Sie uns sagen, dass Sie
String
auf IhreService
dass Sie möchten, senden Sie es zu einemTextView
auf IhreActivity
. Es sollte so AussehenIhren Dienst:
Ihre Activty:
InformationsquelleAutor der Antwort Naheel