我们都知道,contexwrapper是contextimpl的代理类,那么它是在哪里把contextimpl和contextwrapper绑定在一起的呢,如下为调用过程:
LoadedApk.java:
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
Instrumentation.java:
public Application newApplication(ClassLoader cl, String className, Context context)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return newApplication(cl.loadClass(className), context);
}
Instrumentation.java:
static public Application newApplication(Class<?> clazz, Context context)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Application app = (Application)clazz.newInstance();
app.attach(context);
return app;
}
Application.java:
/**
* @hide
*
/*
package */ final void attach(Context context) {
attachBaseContext(context);//这里就是关联的地方,把ContextImpl的context实例传递进attachBaseContext里面
mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}
attachBaseContext做的事情:
ContextWrapper.java:
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
//contextimpl的实例就传递给contextwrapper的mBase了,绑定完成。