android framework中contexwrapper和contextimpl的关联过程(基于Android 5.1)

我们都知道,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了,绑定完成。

 

你可能感兴趣的:(android,framework)