(我有一个带有AIDL接口的远程服务,该接口被多个客户端应用程序使用。我想在接口上添加一个异步方法,用于需要一些时间的调用,但我需要解决方案是安全,这意味着只有我的应用程序可以与服务进行通信。客户端应用程序使用与服务应用程序相同的签名进行签名。目前,应用程序只绑定到服务并调用单个接口执行各种操作的方法。
一个选项是在操作完成时从服务广播Intent并在客户端应用程序中使用BroadcastReceiver,但是(问题#1 )可以通过确保仅我的方式完成应用可以收到意图吗? setPackage()似乎是这样做的,但是我需要支持Gingerbread设备,这似乎根据答案排除了这种方法:setPackage for intent in gingerbread
所以我似乎需要添加第二个.aidl接口和服务使用的回调接口,由客户端实现。我已经看到了在这里使用监听器的示例,但是我不确定与客户端仅将第二个接口对象作为参数传递有什么区别(在此答案的IScript / IScriptResult示例中使用:Service call backs to activity in android)
问题#2 ,在这里使用侦听器与回调方法有什么好处?
答案 0 :(得分:22)
回调方法/监听器是正确的做法。 (正如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
注册另一个进程的死亡通知。