先看图
我们经常使用getSystemService(String name)方法来获取一个系统服务,那么这些系统Binder引用是如何传递给客户端的呢?
getSystemService方法的实现在ContextImpl类中,而ContextImpl中的getSystemService方法,实际上是调用SystemServiceRegistry类中的getSystemService方法。该方法在map中根据服务名称返回fetcher对象,再调用fetcher对象的getService方法。
而 SYSTEM_SERVICE_FETCHERS实际上是一个Map,key为服务名称,而value为一个ServiceFetcher对象
ServiceFetcher
ServiceFetcher实际上为一个接口,提供了一个getService方法供子类实现。而实现ServiceFetcher的有几个类,不管具体作用是什么,它们在实现getService方法时,都调用了自己的抽象方法 createService()。
SYSTEM_SERVICE_FETCHERS
我们再来看SYSTEM_SERVICE_FETCHERS这个Map是什么时候赋值的。
SystemServiceRegistry在静态代码块中注册了各种服务,而注册的过程,实际上就是为map添加数据。
实际应用
我们以AudioManager为例:
AudioManager被注册时,新建了一个CachedServiceFetcher类,实现了createService方法(创建AudioManager对象)。(还记得之前的叙述吗?ContextImpl.getSystemService->SystemServiceRegistry.getSystemService->Fetcher.getService->Fetcher.createService)
这样,就获得了AudioManager这个服务。
而当我们在程序中使用AudioManager的方法时,例如audioManager.adjustStreamVolume(...) 。查看adjustStreamVolume方法
其中会调用AudioManager自己的getService方法
最终会从ServiceManager这个大管家中获取Binder对象。
什么都没有一张流程图来的直观。