Remote-Service-Callbacks von Android

8

(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?

    
Android QS 29.01.2013, 21:53
quelle

1 Antwort

19

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:

  • Deklarieren Sie eine Berechtigung im AndroidManifest.xml Ihres Service. Stellen Sie sicher, dass es signature level ist.
  • Fügen Sie diese Berechtigung in Ihrem service -Tag
  • hinzu
  • In allen anderen Apps verwenden Sie uses-permission , um es zu verwenden.

Ein paar andere Dinge zu beachten:

  • Im Aufrufer müssen Sie die Klasse 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.
  • Wenn sich der Dienst möglicherweise in einem anderen Prozess als der Aufrufer befindet, sollte jeder sich mit der Option IBinder.linkToDeath . für die Todesmeldung des anderen registrieren.
Adrian Taylor 30.01.2013, 09:37
quelle