Android remote-service, der Rückrufe
(Ich habe eine remote service mit einer AIDL-Schnittstelle, die verwendet wird, um mehrere client-apps. Ich möchte hinzufügen, dass eine asynchrone Methode, um die Schnittstelle für Aufrufe, die einige Zeit in Anspruch nehmen, aber ich brauche die Lösung zu sein sichere, was bedeutet, dass nur meine Anwendungen kann die Kommunikation mit dem service. Die client-Anwendungen sind signiert mit der gleichen Signatur wie die service-app. Derzeit sind die apps nur binden, um die service-und call-a single interface-Methode zum ausführen verschiedener Operationen.
Eine option ist die übertragung Absicht aus dem Dienst, wenn der Vorgang abgeschlossen ist, und mit einem BroadcastReceiver in der client-Anwendung, aber (Frage #1) kann dies auf eine Weise erfolgen, die sicherstellt, dass nur meine apps erhalten können, die Absicht? setPackage() scheint dies zu tun, aber ich brauche die Unterstützung von Gingerbread-Geräten, das scheint die Regel, dass der Ansatz nach der Antwort hier: setPackage für Vorsatz in Lebkuchen
So scheint es, brauche ich einen zweiten .aidl-interface mit den callback-Schnittstelle für den service zu verwenden, umgesetzt durch den AUFTRAGGEBER. Ich habe gesehen, Beispiele verwenden, die Zuhörer hier, aber ich bin nicht sicher was der Unterschied ist gegenüber dem Kunden nur auf der Durchreise in die zweite interface-Objekt als argument (wie in der IScript /IScriptResult Beispiel aus dieser Antwort: Service-Aufruf mit dem Rücken zur Tätigkeit in android)
Frage #2, was ist der Vorteil der Verwendung eines listener-hier im Vergleich eine callback-Methode?
- Zuhörer sind callback-Methoden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer callback-Methode/listener ist die richtige Sache zu tun. (Als CommonsWare sagt, es ist ziemlich viel die gleiche Sache). Ich würde sagen, es ist viel einfacher als das hantieren mit BroadcastReceivers, da Sie bereits mit aidl.
Etwas wie dieses:
IAsyncThing.aidl:
IAsyncThingListener.aidl:
Können Sie erzwingen, dass nur Ihre apps binden können, um den Dienst mit einer Unterschrift, für die die Berechtigungen auf Ihrem service (siehe Hinweis auf service "Berechtigungen" hier: http://developer.android.com/guide/topics/security/permissions.html). Speziell:
AndroidManifest.xml
. Sicher ist essignature
Ebene.service
taguses-permission
zu verwenden.Ein paar andere Dinge zu beachten:
IAsyncThingListener.Stub
. Ihre Berufung Anwendungs-code kann schon sein Unterklassen etwas anderes, so dass heißt, Sie müssten, um eine zusätzliche (vermutlich inneren) Klasse erhalten die Benachrichtigung über die Beendigung. Ich erwähne dies nur, weil dies vielleicht die Antwort auf die Frage #2 - was ich nicht ganz verstehen.IBinder.linkToDeath
.IBinder.linkToDeath
bit ist. Du wirst gesagt bekommen, wenn die Anwendung getötet. In allen anderen Fällen (z.B. es geht in den hintergrund) alle IPC-Kommunikation sollte immer noch funktionieren.