wake-up-neo.com

Kommunizieren Sie mit Activity from Service (LocalService) - Best Practices für Android

Allgemeines Szenario - Aktivität mit einem Hintergrunddienst zum Abfragen des Servers.

Der Service wird regelmäßig über AlarmManager ausgeführt und führt auch Aufgaben für die Aktivität aus (Benutzer drückt eine Taste, holt etwas vom Server).

Ich würde gerne die besten Praktiken hier kennen. Ich denke, das beste Design wäre das Android LocalService-Beispiel: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Im Beispiel hat die Aktivität jedoch einen Verweis auf die Aktivität mBoundService, es besteht jedoch keine umgekehrte Verbindung ( Der Dienst kann die Aktivität nicht aufrufen ).

Wie kann der Service die Aktivität am besten aufrufen?

Verwende ich Absichten, BroadcastReceivers, Nachrichten? Wie?

20
paulpooch

Ich denke, das beste Design wäre das Android LocalService-Beispiel: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Würde ich nicht. Verwenden Sie die lockerste Verbindung, die Sie aushalten können. Zielen Sie daher im Durchschnitt auf das Befehlsmuster mit startService() anstelle des Bindungsmusters mit bindService(). Insbesondere ist das Binden ein wenig mühsam, wenn es darum geht, mit Konfigurationsänderungen umzugehen (z. B. Bildschirmdrehungen).

Wie kann der Service die Aktivität am besten aufrufen? Verwende ich Absichten, BroadcastReceivers, Nachrichten? Wie?

Siehe Aktivität vom Service benachrichtigen

9
CommonsWare

Wenn Sie eine enge Kopplung zwischen Ihrer Aktivität mit bindService () benötigen, hängt die Art der Kommunikation davon ab, von wem die Kommunikation stammt.

Wenn der Dienst seinen Ursprung hat (z. B. ein Alarm, der neue Informationen zu teilen hat), wird normalerweise eine Sendung gesendet.

Wenn die Aktivität ihren Ursprung hat (z. B. "etwas vom Server holen"), kann sie mit AsyncTask oder einer ähnlichen Funktion asynchron verarbeitet werden. Das heißt, Sie können die Ergebnisse vom Server in AsyncTask.doInBackground () abrufen und in der Aktivität in AsyncTask.onPostExecute veröffentlichen. Dieses Szenario ist etwas komplizierter, wenn erwartet wird, dass der angeforderte Vorgang sehr lange dauert. In diesem Fall würde ich ihn entkoppeln und stattdessen eine Sendung vom Dienst zurücksenden.

1
prunicki

Wie geschrieben hier

Wenn Sie von einem Dienst zu einer Aktivität oder einem Fragment kommunizieren möchten, die bzw. das den Dienst NICHT gestartet hat, oder von einem Dienst zu mehreren Aktivitäten/Fragmenten kommunizieren möchten, können Sie Event Bus oder Broadcast Intents verwenden, da diese für ein Ereignis in einer Aktivität oder einem Fragment einen Rückruf erhalten können Wenn Sie vom Dienst zu einer Aktivität/einem Fragment kommunizieren möchten, die/das den Dienst gestartet hat, können Sie Pending Intent oder Messenger verwenden, da sie in ein Intent-Extra eingefügt und an den Dienst übergeben werden können.

Ausstehende Absicht

Wir können createPendingResult () verwenden, um ein neues PendingIntent-Objekt zu erstellen, das Sie an service übergeben können, um Ergebnisdaten zu verwenden und innerhalb des Rückrufs onActivityResult (int, int, Intent) an Ihre Aktivität zurückzusenden.

Event Bus

Sie können vom Service Ereignisse auslösen lassen, auf die Aktivitäten oder Fragmente mit Event Bus warten und reagieren können.

Messenger

Messenger ist paketfähig und kann daher in eine Absichtserklärung aufgenommen werden, damit Ihre Aktivität diesen Messenger an den Dienst weiterleiten kann. Der Dienst füllt das Nachrichtenobjekt mit den Daten, die gesendet werden müssen.

Broadcast Intents

Der Dienst kann eine Sendung senden, die von der Aktivität beantwortet werden kann.

0