这个模式准备用Android来说明,它是Android的灵魂,我相信不论到Android几点几,这个机制是不会变的。
做Android framework的或者阅读过源码的其实会发现Android几乎所有的service都是代理模式,ams、pms、appops、fingerprints等等。那Android为什么要这样做呢?以为目前的水平分析,Android会给每个app启动一个独立的虚拟机,这样做的好处是即便某个app出现崩溃也不会影响系统,最多它那个进程挂掉内存震荡造成暂时卡顿。每个app独立于一个进程空间,那么就存在一个数据共享的问题,也缺少一个主持系统运行的人。就需要通过IPC(跨进程)机制去做到这些。
Android可以使用的ipc机制有很多,framework采用最多的是Binder。这里不粘贴代码只说思想。在Android系统中有很多进程,其中有一个进程运行着ams,sdk中和app开发通过调用am去执行各种方法,其实最终都走到了这里,它们之间就是通过Binder这种机制,去做远程调用。什么意思呢,就是调用远程方法。P2进程调用P1进程的方法,那么P2中势必要持有一个P1的引用(先这样理解),其实叫引用也没毛病,只不过这个引用是P1跨进程返给你句柄,你拿到这个就可以访问P1中的方法,这个过程就像P2将自己很多引用散布在P1、P2...Pn中。其实到这里,再去看那些service和servicemanager,就非常一目了然,这时候再去看binder才是正确的学习方法,直接去看binder只会云里雾里不知所云,存在即合理,一个机制存在,必定是为了一个问题或者一系列相关问题,不妨直接去看看问题,再回头看机制,就会发现和它心有灵犀。
代理模式是跨进程或者说在CS架构中的灵魂。