So lassen Sie Android Service mit Activity kommunizieren

Ich schreibe meine erste Android-Anwendung und versuche, mich mit der Kommunikation zwischen Diensten und Aktivitäten vertraut zu machen. Ich habe einen Dienst, der im Hintergrund ausgeführt wird und einige GPS- und zeitbasierte Protokollierungen durchführt. Ich habe eine Aktivität, die zum Starten und Stoppen des Dienstes verwendet wird.

Als erstes muss ich in der Lage sein herauszufinden, ob der Dienst ausgeführt wird, wenn die Aktivität gestartet wird. Es gibt noch einige andere Fragen dazu, also denke ich, dass ich das herausfinden kann (aber ich kann gerne Ratschläge geben).

Mein eigentliches Problem: Wenn die Aktivität ausgeführt und der Dienst gestartet wird, muss der Dienst eine Möglichkeit haben, Nachrichten an die Aktivität zu senden. An dieser Stelle einfache Zeichenfolgen und Ganzzahlen - hauptsächlich Statusmeldungen. Die Nachrichten werden nicht regelmäßig gesendet, daher halte ich das Abfragen des Dienstes nicht für einen guten Weg, wenn es einen anderen gibt. Ich möchte diese Kommunikation nur, wenn die Aktivität vom Benutzer gestartet wurde. Ich möchte die Aktivität nicht über den Dienst starten. Mit anderen Worten, wenn Sie die Aktivität starten und der Dienst ausgeführt wird, werden in der Benutzeroberfläche der Aktivität einige Statusmeldungen angezeigt, wenn etwas Interessantes passiert. Wenn Sie die Aktivität nicht starten, werden diese Nachrichten nicht angezeigt (sie sind nicht so interessant).

Anscheinend sollte ich feststellen können, ob der Dienst ausgeführt wird, und in diesem Fall die Aktivität als Listener hinzufügen. Entfernen Sie dann die Aktivität als Listener, wenn die Aktivität angehalten oder gestoppt wird. Ist das überhaupt möglich? Die einzige Möglichkeit, dies herauszufinden, besteht darin, dass die Activity Parcelable implementiert und eine AIDL-Datei erstellt, damit ich sie über die Remote-Schnittstelle des Dienstes weiterleiten kann. Das scheint allerdings übertrieben, und ich habe keine Ahnung, wie die Aktivität writeToParcel () / readFromParcel () implementieren soll.

Gibt es einen einfacheren oder besseren Weg? Danke für jede Hilfe.

BEARBEITEN:

Für alle, die sich später dafür interessieren, gibt es einen Beispielcode von Google für die Verarbeitung über AIDL im Beispielverzeichnis: /apis/app/RemoteService.java

Antworten auf die Frage(12)

Ihre Antwort auf die Frage