Was ist der beste Weg, um zwischen Service und Aktivität zu kommunizieren?

7

Now Activity kann auf drei verschiedene Arten eine Verbindung zu Diensten herstellen:

Ich denke, dass BroadcastReceivers der einfachste Weg ist, um zu kommunizieren, aber ich frage mich, warum und wann andere Wege zu benutzen? Oder mit anderen Worten: In welchen Fällen werden Boten oder AIDL als Sendeverfahren am besten eingesetzt?

    
Hazem Hagrass 11.05.2014, 20:14
quelle

4 Antworten

8

Sie können BroadcastReceiver verwenden, wenn Sie die Kommunikation zwischen Service und Activity in Ihrer Anwendung wünschen.

Messenger und AIDL werden hauptsächlich verwendet, wenn Ihre Anwendung mit anderen Prozessen kommunizieren muss ( IPC ). In diesem Fall sollte Ihre Schnittstelle eine Service haben, die eine Handler definiert, die auf verschiedene Arten von Message -Objekten reagiert.

Jetzt ist der Unterschied zwischen Messenger und AIDL ziemlich einfach. Wenn Sie Messenger verwenden, werden alle Anforderungen in einem einzigen Thread in eine Warteschlange gestellt. Dein Service muss also nicht threadsicher sein. Wenn Ihr Service mehrere Anfragen gleichzeitig bearbeiten soll, können Sie AIDL direkt verwenden. In diesem Fall muss Ihr Service Multithreading-fähig sein und threadsicher sein. Tatsächlich ist Messenger am Anfang von AIDL implementiert.

Zum besseren Verständnis sehen Sie sich Gebundene Dienste

an

Sie sollten auch die Antwort von BroadcastReceiver oder Messenger via Handler

überprüfen >     
azizulhakim 11.05.2014, 20:41
quelle
10

Ich verwende meistens LocalBroadcasts . Sie sind im Wesentlichen wie echte Sendungen, aber nur für Ihre Anwendung sichtbar. Zuerst müssen Sie ein BroadcastReceiver erstellen, wie Sie es bei einer normalen Sendung tun würden:

%Vor%

Sie können dann die BroadcastReceiver wie folgt registrieren und die Registrierung aufheben:

%Vor%

Und schließlich können Sie eine Sendung von Ihrem Service oder irgendwo anders in Ihrer Anwendung wie folgt senden:

%Vor%     
Xaver Kapeller 11.05.2014 20:20
quelle
3

Die Antwort von Xaver Kapeller ist in der Tat gut. Es hat jedoch einen (großen) Nachteil: Broadcasts können verpasst werden.

Wenn der Benutzer von Activity weg navigiert (z. B. indem er die letzten Apps anzeigt), heben Sie die Registrierung von BroadcastReceiver s auf. Wenn die Sendung zu diesem Zeitpunkt gesendet wird, erhält Ihre Activity diese Nachricht nicht. Wenn Sie zurück zu Ihrem Activity navigieren, befindet es sich möglicherweise in einem ungültigen Zustand.

Mit ResultReceiver erhalten Sie in diesem Fall immer noch das Ergebnis. Darüber hinaus ist ResultReceiver parcelable , sodass Sie sie in den Lebenszyklusereignissen speichern und wiederherstellen können.
Es verursacht jedoch etwas Overhead, weshalb ich diese experimentelle Bibliothek erstellt habe, um es ein wenig zu erleichtern. Für den Moment verwendet es nur IntentService s, aber es sollte einfach genug sein, um es zu erweitern.

    
nhaarman 11.05.2014 20:53
quelle
2

Wenn Ihr service is used only by the local application nicht über Prozesse hinweg funktionieren muss, können Sie Ihr eigenes Binder class implementieren, das Ihrem Client direkten Zugriff auf public methods in the service ermöglicht.

Hinweis: Dies funktioniert nur, wenn sich Client und Dienst in derselben Anwendung und demselben Prozess befinden. Dies ist am häufigsten der Fall.

Erweitern der Klasse "Binder" Ссылка

>     
Libin 11.05.2014 20:44
quelle

Tags und Links