//LoadedApk.java
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
if (mApplication != null) {
return mApplication;
}
//创建对象
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
//Application对象赋值给ContextImpl.mOuterContext
appContext.setOuterContext(app);
...
return app;
}
public Application newApplication(ClassLoader cl, String className, Context context)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
Application app = getFactory(context.getPackageName())
.instantiateApplication(cl, className);
//ContextImpl对象赋值给ContextWrapper.mBase
app.attach(context);
return app;
}
//ActivityThread.java
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ActivityInfo aInfo = r.activityInfo;
//创建对象ContextImpl
ContextImpl appContext = createBaseContextForActivity(r);
//反射创建Activity对象
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
//Activity对象赋值给ContextImpl.mOuterContext
appContext.setOuterContext(activity);
//ContextImpl对象赋值给ContextWrapper.mBase
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,
r.assistToken);
return activity;
}
从源码来看在创建Application和Activity对象时候都要事先创建ContextImpl,它们会把ContextImpl对象通过调用attach赋值给ContextWrapper.mBase。ContextImpl也会得到它们对应的对象引用赋值给mOuterContext。
getApplication()和getApplicationContext():主要区别在作用域不同,前者在Activity、Service即可获得,后者包含前者功能且BroadcastReceiver等也能获取应用的Application对象。
ContextImpl:是Context的具体功能都是在此类完成,如Application、Activity不会具体实现而是调用此类。