创建绑定服务
https://developer.android.com/guide/components/bound-services
创建提供绑定的服务时,您必须提供 IBinder
,用以提供编程接口,供客户端与服务进行交互之用。您可以通过三种方式定义接口:
如果服务是供您的自有应用专用,并且在与客户端相同的进程中运行(常见情况),您应当通过扩展 Binder
类并从 onBind()
返回该类的实例来创建接口。客户端收到 Binder
后,可利用它直接访问 Binder
实现或 Service
中提供的公共方法。
如果服务只是您自有应用的后台工作器,应优先采用这种方式。您不使用这种方式创建接口的唯一一种情况是:其他应用或不同进程占用了您的服务。
如需让接口跨不同进程工作,您可以使用 Messenger
为服务创建接口。采用这种方式时,服务会定义一个 Handler
,用于响应不同类型的 Message
对象。此 Handler
是 Messenger
的基础,后者随后可与客户端分享一个 IBinder
,以便客户端能利用 Message
对象向服务发送命令。此外,客户端还可定义一个自有 Messenger
,以便服务回传消息。
这是执行进程间通信 (IPC) 最为简单的方式,因为 Messenger
会在单个线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。
Android 接口定义语言 (AIDL) 会将对象分解成原语,操作系统可通过识别这些原语并将其编组到各进程中来执行 IPC。以前采用 Messenger
的方式实际上是以 AIDL 作为其底层结构。如上所述,Messenger
会在单个线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。不过,如果您想让服务同时处理多个请求,可以直接使用 AIDL。在此情况下,您的服务必须达到线程安全的要求,并且能够进行多线程处理。
如需直接使用 AIDL,您必须创建用于定义编程接口的 .aidl
文件。Android SDK 工具会利用该文件生成实现接口和处理 IPC 的抽象类,您随后可在服务内对该类进行扩展。