Ich schreibe meine erste Android-Anwendung und versuche, die Kommunikation zwischen Diensten und Aktivitäten zu verstehen. Ich habe einen Dienst, der im Hintergrund läuft und einige GPS- und zeitbasierte Logging-Funktionen ausführt. Ich werde eine Aktivität haben, die zum Starten und Stoppen des Dienstes verwendet wird.Wie Android Service mit der Aktivität kommunizieren kann
Zuerst muss ich herausfinden können, ob der Dienst ausgeführt wird, wenn die Aktivität gestartet wird. Es gibt einige andere Fragen dazu, also denke ich, dass ich das herausfinden kann (aber zögern Sie nicht, mir Ratschläge zu geben).
Mein echtes Problem: Wenn die Aktivität ausgeführt wird und der Dienst gestartet wird, brauche ich eine Möglichkeit für den Dienst, Nachrichten an die Aktivität zu senden. Einfache Strings und Integer an dieser Stelle - meist Statusmeldungen. Die Nachrichten werden nicht regelmäßig passieren, daher denke ich nicht, dass das Abrufen des Dienstes ein guter Weg ist, wenn es einen anderen Weg gibt. Ich möchte diese Kommunikation nur, wenn die Aktivität vom Benutzer gestartet wurde - ich möchte die Aktivität nicht vom Dienst aus starten. Mit anderen Worten, wenn Sie die Aktivität starten und der Dienst ausgeführt wird, werden einige Statusmeldungen in der Aktivitätsbenutzeroberfläche angezeigt, wenn etwas Interessantes passiert. Wenn Sie die Aktivität nicht starten, werden Sie diese Nachrichten nicht sehen (sie sind nicht so interessant).
Es scheint, als ob ich in der Lage sein sollte festzustellen, ob der Dienst ausgeführt wird, und wenn dies der Fall ist, fügen Sie die Aktivität als Listener hinzu. Entfernen Sie dann die Aktivität als Listener, wenn die Aktivität angehalten oder beendet wird. Ist das überhaupt möglich? Die einzige Möglichkeit, dies herauszufinden, ist, dass die Activity Parcelable implementiert und eine AIDL-Datei erstellt, damit ich sie über die Remote-Schnittstelle des Service weitergeben kann. Das scheint jedoch Overkill zu sein, und ich habe keine Ahnung, wie die Aktivität writeToParcel()/readFromParcel() implementieren sollte.
Gibt es einen leichteren oder besseren Weg? Danke für jede Hilfe.
EDIT:
Für alle, die später daran interessiert ist, gibt es Beispielcode von Google dies in dem Beispielverzeichnis über AIDL zur Handhabung: /apis/app/RemoteService.java
Wie kann ich die Aktivität "busy-warte"? Kannst du bitte erklären ? – iTurki
Also entweder nach onCreate oder nach onStartCommand in Ihrer Serviceklasse setzen Sie eine öffentliche statische Variable, nennen Sie es isConnected oder etwas zu true.Dann in Ihrer Aktivität tun Sie dies: Absicht intent = neue Absicht (act, YourService.class); \t startService (Absicht); while (! YourService.isConnected) { Schlaf (300); } Nach dieser Schleife Ihren Dienst läuft und Sie können die Kommunikation damit. Meiner Erfahrung nach gibt es definitiv einige Einschränkungen der Interaktion mit einem Dienst wie diesem. –
Warum kann es nur in 'Activity.onCreate()' gestartet werden? – skywall