文章目录
背景
这几天在天天在写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