Bound Services:
1. 提供服务端和客户端之间的交互,可以发送请求,获得服务等
2. 通过实现OnBind()方法,返回一个IBind对象,来完成服务端到客户端之间的连接。
3. OnBind()方法只调用一次,当第一个客户端连接服务的时候,系统调用一次OnBind()方法,并返回一个IBind对象。当其他客户端连接服务的时候,使用该IBind对象。
4. 创建一个Bind接口的三种方法:
1) 扩展Binder类:当service对于自己的应用是私有的时候,并且和客户端运行在同一个进程中,使用这种方法。
2) 使用消息:当交互是在不同的进程当中时,使用这种方式。这种方式,客户端可以通过消息向服务端发送命令,服务端也可以返回消息。这是进程间通信最简单的方式,因为消息队列只要求一个单线程,所以不需要考虑线程安全。这种方式一次只能接受一个请求。
3) 使用AIDL:AIDL将所有的工作分解成操作系统可以理解,并且可以在不同进程间通过的对象。要想同时接收多个服务端的请求,就需要使用这种方式。这时,就需要考虑多线程和线程安全了。使用.aidl文件来定义接口。
AIDL:
1. AIDL类似于其他IDL,主要用于进程间的通信。在Android当中,不允许通常的方式来访问内存中的其他进程。需要将访问操作分解为android系统能理解并可以访问进程的对象。AIDL可以完成这种工作。Note:当需要跨进程访问时,并且要使用多线程的时候,就使用AIDL,否则,可以使用扩展Binder类和消息,没必要使用AIDL.
2. 使用AIDL步骤:
1) 在src下受用java语言建立一个.aidl文件,里面通过方法签名定义编程接口。
2) 实现这个接口。接口里有一个Stub的内部抽象类,你必须继承它并实现它的方法。
3) 将接口暴露给服务端。
Note:AIDL文件的修改应该做到向后兼容,以便所有的应用都能使用服务。
3. AIDL所支持类型:java语言的基本类型,如int;String,list,map,CharSequence
4. 定义服务接口的几点:
1) 方法可以接收零个或多个参数,可返回也可不返回值。
2) 所有非原始性参数必须给一个方向性标签,如in,out。
3) AIDL文件中所有的代码注释都包含在生成的IBind接口中,引入包之前的注释除外。
4) 不能暴露静态域。