Android源码剖析之----系统服务的获取

我们先来看看Android的体系结构图:

Android体系结构

可以看到,在Framework层,最核心的功能是一些XXXManager,这些Manager有些是IBinder,有些不是IBinder但间接调用系统服务的IBInder实现功能。总之,这些XXXManager最终的功能是直接或者间接调用系统服务的IPC功能实现的。而系统的所有的服务都通过ServiceManager管理。

我们知道,要调用系统服务的IPC功能,就必须获得系统服务用于IPC的IBInder接口。ServiceManager就是一个提供这样功能的类。我们只需要提供服务所对对应的名字,就可以获得服务所对应的IBInder。下面我们分析一下我们获得系统服务的过程。

我们使用系统服务一般是通过Context里有一个抽象方法getSystemService()实现的,以Activity为例:

@Override
public Object getSystemService(@ServiceName @NonNull String name) {
    if (getBaseContext() == null) {
        throw new IllegalStateException(
                "System services not available to Activities before onCreate()");
    }

    if (WINDOW_SERVICE.equals(name)) {
        return mWindowManager;
    } else if (SEARCH_SERVICE.equals(name)) {
        ensureSearchManager();
        return mSearchManager;
    }
    return super.getSystemService(name);
}

可以看到最终会调用父类的getSystemService(name),那我们看看Acivity父类 ContextThemeWrapper的getSystemService(name):

 @Override public Object getSystemService(String name) {
    if (LAYOUT_INFLATER_SERVICE.equals(name)) {
        if (mInflater == null) {
            mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this);
        }
        return mInflater;
    }
    return getBaseContext().getSystemService(name);
}

这里有调用了BaseContext的 getSystemService(String name),这里的BaseContext其实是一个ContextImpl类,不妨看看:

 @Override
public Object getSystemService(String name) {
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
    return fetcher == null ? null : fetcher.getService(this);
}

可以看到,最终是调用了上面这个方法实现的。

可以看到最终是通过 SYSTEM_SERVICE_MAP获取的。

private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
        new HashMap<String, ServiceFetcher>();

SYSTEM_SERVICE_MAP是一个静态的HashMap,它是通过静态方法registerService()方法初始化的

 private static void registerService(String serviceName, ServiceFetcher fetcher) {
    if (!(fetcher instanceof StaticServiceFetcher)) {
        fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
    }
    SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}

在ContextImpl里有一个静态块:

 static {
    registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
            public Object getService(ContextImpl ctx) {
                return AccessibilityManager.getInstance(ctx);
            }});

    registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
            public Object getService(ContextImpl ctx) {
                return new CaptioningManager(ctx);
            }});

    registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
                IAccountManager service = IAccountManager.Stub.asInterface(b);
                return new AccountManager(ctx, service);
            }});

    registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
                return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
            }});

    registerService(ALARM_SERVICE, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(ALARM_SERVICE);
                IAlarmManager service = IAlarmManager.Stub.asInterface(b);
                return new AlarmManager(service, ctx);
            }});
    .........

    .........

}

可以看到,上面的方法正式获取各种IBinder,并将通过ServiceFetcher封装,添加到SYSTEM_SERVICE_MAP中。

以上就是获取系统服务的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值