Android系统服务(二)
原创
©著作权归作者所有:来自51CTO博客作者lxn1615404043的原创作品,请联系作者获取转载授权,否则将追究法律责任
我们今天继续来看系统服务
把上面的过程总结一下:
1.调用系统服务,调用成功会返回一个Ibinder接口,应用获取到这个接口,完成绑定
2.绑定成功,开始调用,客户端调用transact函数
3.transact会调用IBinder中的onTranscat函数
4.IBinder中的onTranscat函数调用Stub中的onTranscat函数
5.由于Stub继承了我们的接口,所以onTranscat又会调用具体的功能代码
6.AudioService继承了Stub,此时就会执行AudioService中的具体功能
我们是如何获取系统服务的
我们通常使用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);
}});