android系统中的Binder对象获取——应用层怎么和ServiceManager打交道的

android_logo.jpeg

先看图


android系统中的Binder对象获取 (1).png

我们经常使用getSystemService(String name)方法来获取一个系统服务,那么这些系统Binder引用是如何传递给客户端的呢?
getSystemService方法的实现在ContextImpl类中,而ContextImpl中的getSystemService方法,实际上是调用SystemServiceRegistry类中的getSystemService方法。该方法在map中根据服务名称返回fetcher对象,再调用fetcher对象的getService方法。


ContextImpl中的getSystemService方法
SystemServiceRegistry中的getSystemService方法

而 SYSTEM_SERVICE_FETCHERS实际上是一个Map,key为服务名称,而value为一个ServiceFetcher对象


SYSTEM_SERVICE_FETCHERS

ServiceFetcher

ServiceFetcher实际上为一个接口,提供了一个getService方法供子类实现。而实现ServiceFetcher的有几个类,不管具体作用是什么,它们在实现getService方法时,都调用了自己的抽象方法 createService()。


ServiceFetcher相关

SYSTEM_SERVICE_FETCHERS

我们再来看SYSTEM_SERVICE_FETCHERS这个Map是什么时候赋值的。
SystemServiceRegistry在静态代码块中注册了各种服务,而注册的过程,实际上就是为map添加数据。


初始化块

注册方法

实际应用

我们以AudioManager为例:


注册audioManager

CachedServiceFetcher

AudioManager被注册时,新建了一个CachedServiceFetcher类,实现了createService方法(创建AudioManager对象)。(还记得之前的叙述吗?ContextImpl.getSystemService->SystemServiceRegistry.getSystemService->Fetcher.getService->Fetcher.createService)
这样,就获得了AudioManager这个服务。
而当我们在程序中使用AudioManager的方法时,例如audioManager.adjustStreamVolume(...) 。查看adjustStreamVolume方法


adjustStreamVolume

其中会调用AudioManager自己的getService方法
AudioManager的getService方法

最终会从ServiceManager这个大管家中获取Binder对象。

什么都没有一张流程图来的直观。

获取android系统中的Binder

你可能感兴趣的:(android系统中的Binder对象获取——应用层怎么和ServiceManager打交道的)