(Ich habe einen Remote -Dienst mit einer AIDL-Schnittstelle, die von mehreren Client-Apps verwendet wird.) Ich möchte der Schnittstelle eine asynchrone Methode für Anrufe hinzufügen, die einige Zeit brauchen, aber ich brauche die Die Lösung sollte sicher sein, was bedeutet, dass nur meine Anwendungen mit dem Dienst kommunizieren können.Die Client-Anwendungen sind mit derselben Signatur signiert wie die Dienst-App.Zwischen den Apps werden nur Verbindungen zum Dienst hergestellt und eine einzige Schnittstelle aufgerufen Methode, um verschiedene Operationen durchzuführen.
Eine Option ist das Senden einer Absicht aus dem Dienst, wenn die Operation abgeschlossen ist und die Verwendung eines BroadcastReceivers in der Client-Anwendung, aber ( Frage # 1 ) kann auf eine Weise erfolgen, die nur my gewährleistet Apps können die Absicht erhalten? setPackage () scheint dies zu tun, aber ich muss Gingerbread-Geräte unterstützen, was diesen Ansatz laut der Antwort hier ausschließt: setPackage für die Absicht in Lebkuchen
Es scheint also, dass ich eine zweite .aidl-Schnittstelle mit der Callback-Schnittstelle für den Service hinzufügen muss, die vom Client implementiert wird. Ich habe Beispiele gesehen, die Listener hier verwenden, aber ich bin mir nicht sicher, was der Unterschied zum Client ist, wenn ich das zweite Interface-Objekt als Argument übergebe (wie im IScript / IScriptResult-Beispiel aus dieser Antwort: Service ruft zurück zu Aktivität in Android )
Frage # 2 , was ist der Vorteil der Verwendung eines Listeners hier im Vergleich zu einer Callback-Methode?
Eine Callback-Methode / ein Listener ist das Richtige. (Wie CommonsWare sagt, ist es ziemlich genau dasselbe). Ich würde sagen, es ist viel einfacher, als mit BroadcastReceivers herumzuspielen, da Sie bereits aidl benutzen.
In etwa so:
IAsyncThing.aidl:
%Vor%IAsyncThingListener.aidl:
%Vor%Sie können erzwingen, dass nur Ihre Apps an den Dienst binden können, indem Sie eine Berechtigung auf Signaturebene für Ihren Dienst verwenden (siehe den Hinweis zu "Dienstberechtigungen" hier: Ссылка ). Speziell:
AndroidManifest.xml
Ihres Service. Stellen Sie sicher, dass es signature
level ist. service
-Tag uses-permission
, um es zu verwenden. Ein paar andere Dinge zu beachten:
IAsyncThingListener.Stub
ableiten. Ihr aufrufender Anwendungscode könnte bereits etwas anderes unterklassifizieren, was bedeutet, dass Sie eine zusätzliche (wahrscheinlich innere) Klasse verwenden müssen, um die Abschlussbenachrichtigung zu erhalten. Ich erwähne das nur, weil dies die Antwort auf die Frage Nr. 2 sein könnte - die ich nicht vollständig verstehe. IBinder.linkToDeath
. für die Todesmeldung des anderen registrieren. Tags und Links android service android-intent aidl callback