//添加view
wm.addView(view, layoutParams);
注册服务(addService
): 在Android开机启动过程中,Android会初始化系统的各种 Service,并将这些Service向ServiceManager
注册(即让ServiceManager
管理)。 这一步是系统自动完成的。
获取服务(getService
): 客户端想要得到具体的Service直接向ServiceManager
要 即可。客户端首先向ServiceManager
查询得到具体的Service引用,通常是Service 引用的代理对象,对数据进行一些处理操作。即第2行代码中,得到的wm是 WindowManager
对象的引用。
使用服务: 通过这个引用向具体的服务端发送请求,服务端执行完成后就返回。即 第6行调用WindowManager
的addView
函数,将触发远程调用,调用的是运行在 systemServer进程中的WindowManager
的addView
函数。
使用服务的具体执行过程
1.Client通过获得一个Server的代理接口,对Server进行调用。
2.代理接口中定义的方法与Server中定义的方法是一一对应的。
3.Client调用某个代理接口中的方法时,代理接口的方法会将Client传递的参数打 包成Parcel对象。
4.代理接口将Parcel发送给内核中的Binder Driver。
5.Server会读取Binder Driver中的请求数据,如果是发送给自己的,解包Parcel 对象,处理并将结果返回。
6.整个的调用过程是一个同步过程,在Server处理的时候,Client会Block住。因 此Client调用过程不应在主线程。
AIDL的使用
1.AIDL的简介
AIDL (Android Interface Definition Language) 是一种接口定义语言,用于生成可以 在Android设备上两个进程之间进行进程间通信(Interprocess
Communication
, IPC
) 的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service) 对象的操作,就可以使用AIDL生成可序列化的参数,来完成进程间通信。
简言之,AIDL能够实现进程间通信,其内部是通过Binder机制来实现的,后面会 具体介绍,现在先介绍AIDL的使用。
2.AIDL的具体使用
AIDL的实现一共分为三部分,一部分是客户端,调用远程服务。一部分是服务端, 提供服务。最后一部分,也是最关键的是AIDL接口,用来传递的参数,提供进程间 通信。
先在服务端创建AIDL部分代码。
AIDL文件 通过如下方式新建一个AIDL文件
默认生成格式
interface IBookManager {
/**
-
<