ServiceManager是运行在单独的进程中的,MediaServer通过Binder机制跟ServiceManger进行通信,MediaServer(运行在跟ServiceManager不同的进程)初始化媒体相关的几个Service,然后加入到ServiceManger中进行管理。
Binder机制是Android系统非常重要的一种IPC机制,代理端BpBinder,服务端BbBinder,都实现IBinder接口。BpBinder和BbBinder其实都是运行在表面的棋子,真正进行进程间通信(说白了就是真正干活)的是IPCThreadState ,通过transaction方法与Binder设备层(内核)进行通信。主要是两个步骤:(1)打开Binder设备(2)内存映射
ServiceManger的服务端其实没有采用Android系统的封装BbBinder机制来运作的,它是直接用的原始代码直接打开Binder设备,内存映射,读取数据来进行的。
ServiceManger的作用:
(1)个人觉得体现了职责分工明确的设计思想,类似于Facade模式
(2)ServiceManager能够进行权限的控制
Service常见几点:
(1)本地进程的Service访问无需使用AIDL,直接使用startService或者bindService使用。
(2)非本地进程如果没有多线程访问的需求,可以使用Messenger进行IPC访问,Messenger关联相应的Handler,发送message,其本质也是通过binder来进行IPC通信的。
(3)对于跨进程而且多线程同时访问的需求,可以使用AIDL方式进行。这个情况Service实现段要注意线程安全问题。
AIDL工具的作用就是按照AIDL文件的接口定义自动产生Service对应的服务端和客户端(代理端)胶水代码,服务端为stub,客户端为proxy。proxy根据构造时候传入的stub参数(IBinder类型),调用stub进行相应的方法处理。stub从parcel的data里读取相应的参数,执行相应的方法,再把方法执行结构写入parcel的reply对象。proxy从reply读取返回值并构造成相应的执行结果,到了这个时候IPC调用彻底执行完成。说白了stub才是其实真正做这个事情的幕后员工!