Android API Guides 翻译:Bound Service

以下内容翻译自官方文档

http://developer.android.com/guide/components/bound-services.html#Creating


创建一个绑定的 Service

提供可绑定的 Service,需要先提供 IBinder 接口实例给客户端,用来作为和服务端的通信接口。一共有三种方式来定义通信接口

继承 Binder 类

如果 service 是应用私有的,并且和 client 运行在同一进程中,可以创建通过继承 Binder 类,在 onBind() 回调中返回实例,用来作为通信接口。client 检索 Binder ,直接使用 Binder 提供的公有方法,甚至直接调用 Service 的方法。

如果 service 只为该应用做后台工作,这是一样很好的技术。其他不适用该方式的场景在于,service 会被其他应用使用,或者运行在其他的进程中。

使用 Messenger 类

如果需要通信接口在不同的进程中工作,可以使用 Messenger 类来实现。在指南里,service 定义一个 Handler 来响应不同类型的 Message 对象。这个 Handler 是 Messenger 使用的,可以和 client 共享一个 IBinder,允许 client 使用 Message 来向 service 发送命令。另外,client 也可以定义一个 Messenger 用来获得 service 返回的 messages。

这是进行进程间通信(IPC)的简单方式,因为 Messenger 把所有的请求放入了同一个单例线程,所以不需要对 service 进行线程安全的设计。

使用 AIDL

AIDL(Android Interface Definition Language)执行了所有的工作,分解对象成为最基本的单元,使操作系统能够在进程中理解并且让它们各就各位执行 IPC。以上使用 Messenger 的底层就是基于 AIDL 的。Messenger 能够在一个单独的线程中为 client 的所有请求创建队列,所以 service 每次只获取一条请求。然而,如果要让 Service 去同时处理多个请求,就要直接使用 AIDL。在这种情况下,service 必须具备有多线程处理和线程安全。

注意:大部分应用不需要使用 AIDL 去创建一个绑定的 service,因为这需要具备多线程的能力,还会导致更多复杂的实现。AIDL 并不适合大部分的应用,所以如果需要使用,直接阅读 AIDL 文档。