Android远程服务回调

And*_* QS 9 service android callback aidl android-intent

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

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

因此,似乎我需要添加第二个.aidl接口和服务使用的回调接口,由客户端实现.我已经看到了在这里使用侦听器的示例,但我不确定与客户端仅将第二个接口对象作为参数传递有什么区别(如此答案中的IScript/IScriptResult示例中所使用的:服务调用返回到活动中android)

问题#2,在这里使用监听器与回调方法有什么好处?

Adr*_*lor 22

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

像这样的东西:

IAsyncThing.aidl:

package com.my.thingy;

import com.my.thingy.IAsyncThingListener;

interface IAsyncThing {
  void doSomething(IAsyncThingListener listener);
}
Run Code Online (Sandbox Code Playgroud)

IAsyncThingListener.aidl:

package com.my.thingy;

import com.my.thingy.IAsyncThingListener;

interface IAsyncThingListener {
  void onAsyncThingDone(int resultCodeIfYouLike);
}
Run Code Online (Sandbox Code Playgroud)

您可以通过对服务使用签名级权限来强制只有您的应用可以绑定到该服务(请参阅此处有关"服务权限"的说明:http://developer.android.com/guide/topics/security/permissions .html).特别:

  • 在您的服务中声明权限AndroidManifest.xml.确保它是signature水平的.
  • 在您的service代码中添加该权限
  • 在所有其他应用程序中,uses-permission使用它.

还有其他几点要记住:

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

  • 这就是`IBinder.linkToDeath`位用于的目的.如果申请被杀,你会被告知.在所有其他情况下(例如,它在后台),所有IPC通信仍应正常工作. (5认同)
  • `IAsyncThingListener.aidl` 中的导入行是否有原因? (2认同)