上一节我们学习了AIDL中涉及到的Binder相关的类,如下图:
接下来讲解Service Manager。
Service Manager是一个笼统的概念,整体来说它是Binder Driver之上的"DNS"功能,用于Client方便的获得其他服务,比如Activity Manager Service。ServiceManager和AcitivtyManagerService从层次上讲是平级的,都是Binder Server,只不过ServiceManager统一维护了很多Binder Server,如果不通过Service Manager,也是可以访问到Activity Manager Service的。
Service Manager也包括C++实现和Java封装。C++层的特点是最早初始化,循环读取消息。我们这里不做过多介绍,而是主要分析Java层的类结构。
Service Manager的目的是提供其他service的入口,因此它提供了getService等方法。与上文提到的AIDL结构对比来看,他们是这样的:
定义了一个IServiceManager接口,与我们前文提到的业务接口同级,继承自IInterface。
前文提到AIDL自动生成了一个Stub类,它实现了业务接口,同时继承自Binder。我们再看看ServiceManager这边:
看到没,ServiceManagerNative和Stub基本一毛一样,都是抽象类,同样的类结构,同样的方法。都是调用C++实现跨进程通信。
那么Proxy呢?相信你一定也猜到了:
AIDL中Proxy是Stub的内部类,而ServiceManager中Proxy也是Native的内部类,完全一致!
那么AIDL中具体的业务实现类MyServer,在ServiceManager中对应的是哪个类呢?ServiceManagerNative是个抽象的,必然有一个子类啊?很遗憾我这里没找到。
最后有一个就叫ServiceManager.java的类,它就是一个工厂类,提供了静态的getService方法,没啥特别的。
最后整体类图如下: