Android系统服务(二)

本文详细解读了系统服务的获取过程,从调用系统服务到获取IBinder接口完成绑定,再到通过transact函数调用IBinder的onTranscat函数,最终执行具体功能代码的完整流程。通过实例分析getSystemService方法的源码,展示了如何利用SystemServiceRegistry和ServiceFetcher实现系统服务的高效获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

把上面的过程总结一下:
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);
            }});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值