Android Context.getSystemService() 与 ServiceManager 的理解和使用

背景

这几天在天天在写Context.getSystemService()获取系统服务,例如在获取窗口服务的时候都会这样写:

WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

突然有人问我说,就是getSystemService() 每次获取的对应的WindowManager是否是同一个,还是每次生成新的?

直接翻看了下源码,事实上还是比较简单的,以下做一下记录:

分析

直接看一下Context源码:

// Context
public abstract Object getSystemService(@ServiceName @NonNull String name);

Context只是一个抽象类,具体看下实现类ContextWrapper

@Override
public Object getSystemService(String name) {
   
    return mBase.getSystemService(name);
}

ContextWrapper使用了代理模式,mBase是Context的具体实现。

在Activity启动的时候,ActivityThread的performLaunchActivity中会创建ContextImpl,同时会调用了Activity的attach(),将Context设置给了activity

// ActivityThread
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
   
        // 创建了ContextImpl
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        // 反射创建了activity
        java.lang.ClassLoader cl = appContext.getClassLoader();
        activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
        // 创建applicaiton
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        
        appContext.setOuterContext(activity);
        // 将appContext传入
        activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);
        return activity;
    }

ContextImpl才是Context的真正实现。

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

SystemServiceRegistry是一个负责注册系统服务的类,内部有一个静态的HashMap,静态加载了各种系统服务在里面,其中就包括了window_service。

    // ContextImpl
    private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES =
            new HashMap<Class<?>, String>();
    private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值