Android远程服务callback

(我有一个远程服务,有一个AIDL接口,由几个客户端应用程序使用,我想添加一个asynchronous方法到接口,需要一些时间的调用,但我需要的解决scheme是安全的 ,这意味着只有我的应用程序可以与服务进行通信,客户端应用程序的签名与服务应用程序的签名相同,目前应用程序只是绑定到服务上,调用单一的接口方法来执行各种操作。

一种select是在操作完成时在服务中广播一个Intent,并在客户端应用程序中使用BroadcastReceiver,但是( 问题#1 )可以确保只有我的应用程序能够接收Intent? setPackage()似乎这样做,但我需要支持姜饼设备,这似乎排除根据这里的答案: setPackage姜饼意图

所以看来我需要添加第二个.aidl接口与服务的callback接口使用,由客户端实现。 我已经看到了在这里使用监听器的例子,但我不确定与仅仅传入第二个接口对象作为参数的客户端有什么不同(在IScript / IScriptResult例子中用到了这个答案: 服务调用回到活动android

问题2 ,在这里使用监听器和callback方法有什么好处?

Solutions Collecting From Web of "Android远程服务callback"

callback方法/侦听器是正确的。 (正如CommonsWare所说,这几乎是一回事)。 我会说这比用BroadcastReceivers摆弄简单得多,因为你已经在使用aidl了。

像这样的东西:

IAsyncThing.aidl:

package com.my.thingy; import com.my.thingy.IAsyncThingListener; interface IAsyncThing { void doSomething(IAsyncThingListener listener); } 

IAsyncThingListener.aidl:

 package com.my.thingy; import com.my.thingy.IAsyncThingListener; interface IAsyncThingListener { void onAsyncThingDone(int resultCodeIfYouLike); } 

您可以强制执行,只有您的应用可以通过对服务使用签名级权限来绑定到服务(请参阅“服务权限”的注释: http : //developer.android.com/guide/topics/security/permissions .html )。 特别:

  • 在服务的AndroidManifest.xml声明一个权限。 确保它是signature级别。
  • 在您的service标签中添加该权限
  • 在所有其他应用程序中,使用uses-permission来使用它。

还有几件事要记住:

  • 在调用者中,你需要IAsyncThingListener.Stub 。 你的调用应用程序代码可能已经是其他的子类,所以这意味着你必须使用一个额外的(可能是内部的)类来接收完成通知。 我只提到这一点,因为这可能是问题2的答案 – 我不完全明白。
  • 如果服务可能与调用者处于不同的进程中,则应使用IBinder.linkToDeath注册另一个进程的死亡通知。