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?
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
anSie sollten auch die Antwort von BroadcastReceiver oder Messenger via Handler
überprüfen > 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:
Sie können dann die BroadcastReceiver
wie folgt registrieren und die Registrierung aufheben:
Und schließlich können Sie eine Sendung von Ihrem Service
oder irgendwo anders in Ihrer Anwendung wie folgt senden:
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.
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" Ссылка
>Tags und Links android