Android 绑定类型服务---创建绑定类型的服务

创建具有绑定能力的服务时,必须提供一个IBinder对象,它用于给客户端提供与服务端进行交互的编程接口。有三种方法能够定义这个接口:

1. 继承Binder类

如果你的服务是你的应用程序的私有服务,并且跟客户端运行在同一个进程中,那么就应该通过继承Binder类来创建你的接口,并且佛从onBind()方法中返回这个接口的一个实例。客户端接收这个Binder对象,并且能够使用这个对象直接访问Binder类中实现的或Service中的公共方法。

当你的服务只是在后台给你自己的应用程序工作时,这是首选技术。不使用这种方法创建服务接口的唯一原因是因为你的服务要其他应用程序或跨进程使用。

2. 使用信使(Messenger)

如果你的接口要跨越不同进程来进行工作,那么你能用信使给服务创建接口。在这种方式中,服务定义了响应不同消息对象类型的处理器。这个处理器是一个信使的基础,它能够跟客户端共享一个IBinder对象,允许客户端使用Message对象给服务端发送命令。另外,客户端能够定义一个自己的信使,以便服务端能够给客户端发送消息。

这是执行进程间通信(IPC)最简单的方法,因为信使队列的所有请求都在一个单线程中,因此不需要针对线程安全来设计你的服务。

3. 使用AIDL(Android Interface Definition Language)

AIDL(Android 接口定义语言)执行所有的把对象分解成操作系统能够理解的原语的工作,并且把它们编组到执行IPC(进程间通信)的不同进程中。使用信使的技术实际上是基于AIDL架构。就像前面提到的,信使在一个单线程中创建了一个所有客户端请求的队列,因此服务每次只能接收一个请求。但是,如果你想要服务同时处理多个请求,那么就能直接使用AIDL,这种情况下,你的服务必须是多线程的并且要线程安全。

要使用直接AIDL,就必须创建一个定义编程接口的.aidl文件。Android SDK使用这个文件生成一个实现文件中定义的接口和处理IPC的抽象类,然后你能够在你的服务中进行扩展。

注意:大多数应用程序不应该是AIDL来创建绑定类型的服务,因为它可能需要多线程的能力,并可能导致更复杂的实现。因此,AIDL不适用于大多数应用程序,并且这份文档不讨论怎样使用它来创建服务,如果你确定需要直接使用AIDL,请看AIDL文档。

你可能感兴趣的:(android)