(我有所使用的几个客户端应用程序的AIDL接口的远程服务。我想异步方法添加到这个需要一定的时间调用接口,但我需要的解决方案是安全的 ,也就是说只有我的应用程序可以通过该服务进行通信,客户端应用程序与相同的签名服务的应用程序签名。目前的应用程序只是绑定到服务,并调用一个单一的接口方法来执行各种操作。
一种选择是从服务广播的意图,当操作完成,并且在客户端应用程序中使用广播接收器,但( 问题1)可以这样在确保只有我的应用程序可以接收意向的方式呢? setPackage()似乎要做到这一点,但我需要支持姜饼设备,这似乎是根据这里的答案排除方法: setPackage在姜饼意图
如此看来,我需要添加第二个.aidl接口与回调接口,使用该服务,通过客户端来实现。 我已经看到,这里使用监听器的例子,但我不知道有什么区别与客户只是在第二界面对象作为参数传递(从这个回答中的iScript / IScriptResult示例中使用: 服务回调到活动安卓 )
问题2,什么是这里使用侦听与一个回调方法的好处?
回调方法/监听器是做正确的事。 (作为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
。