🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
![](https://img.kancloud.cn/a4/b1/a4b19b3f7490ca67b66402afdfd35802_936x1348.png) !!!实际上,我们获取的Service对象并不是实际的对象类,而是其代理。运用了代理模式:在触发原对象的同时,还会触发Binder驱动的相关操作 ** 代理的对象,是客户端持有的远程服务引用, 实际上甚至这个引用也并不是真正的远程Binder对象,下文讲到** 1. getSystemService(getApplication().WINDOW_SERVICE);函数内部原理就是向ServiceManager查询标识符为getApplication().WINDOW_SERVICE的远程对象的引用,该对象继承Binder类 2. 客户端持有远程服务的引用(并不是实际真实的远程Binder对象,这个引用实质上是WindowManager的某个代理) 3. 客户端调用引用的函数,代理把参数打包到Parcel对象中,然后调用transact函数(该函数继承自Binder) 4. Binder驱动转发 5. 远程进程服务处理 6. Binder驱动转发 7. 客户端响应 ## Binder机制原理 在Android系统的Binder机制中,是有Client,Service,ServiceManager,Binder驱动程序组成的,其中Client,service,Service Manager运行在用户空间,Binder驱动程序是运行在内核空间的。而Binder就是把这4种组件粘合在一块的粘合剂,其中核心的组件就是Binder驱动程序,Service Manager提供辅助管理的功能,而Client和Service正是在Binder驱动程序和Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供设备文件/dev/binder与用户控件进行交互,Client、Service,Service Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。而Binder Manager是一个守护进程,用来管理Service,并向Client提供查询Service接口的能力。