我们今天继续来看系统服务

Android系统服务(二)_ide

Android系统服务(二)_系统服务_02

Android系统服务(二)_系统服务_03

Android系统服务(二)_ios_04

把上面的过程总结一下:
1.调用系统服务,调用成功会返回一个Ibinder接口,应用获取到这个接口,完成绑定
2.绑定成功,开始调用,客户端调用transact函数
3.transact会调用IBinder中的onTranscat函数
4.IBinder中的onTranscat函数调用Stub中的onTranscat函数
5.由于Stub继承了我们的接口,所以onTranscat又会调用具体的功能代码
6.AudioService继承了Stub,此时就会执行AudioService中的具体功能

我们是如何获取系统服务的

Android系统服务(二)_ide_05

我们通常使用getSystemService来获取系统服务,接下来我们看看getSystemService的源码

@Override
public Object getSystemService(String name) {
return SystemServiceRegistry.getSystemService(this, name);
}

这里调用了SystemServiceRegistry的方法

public static Object getSystemService(ContextImpl ctx, String name) {
ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
return fetcher != null ? fetcher.getService(ctx) : null;
}

又调用了ServiceFetcher的getService方法

static abstract interface ServiceFetcher<T> {
T getService(ContextImpl ctx);
}

我们发现这是一个抽象的类,那么我们去找找它的实现类

registerService(Context.AUDIO_SERVICE, AudioManager.class,
//实现类在此
new CachedServiceFetcher<AudioManager>() {
@Override
public AudioManager createService(ContextImpl ctx) {
return new AudioManager(ctx);
}});