Activity
与
Context
的关系图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgjzUNUx-1603721125460)(https://github.com/wfeii/wfeii.github.io_raw_important/blob/master/AOSP/Context%E4%B8%8EActivity/Context%E7%9A%84%E7%B1%BB%E7%BB%93%E6%9E%84.png?raw=true)]
Context
是通过装饰者模式来组织的。ContextImp
实现了通用的Context
接口,也是为Activity
和Application
提供基础的Context
接口。对于装饰者类均有一个mBase
指向Context
对象,实际指向ContextImp
对象。
//ContextWrapper中
public Context getBaseContext() {
return mBase;
}
//当前进程的Appliction对象
public final Application getApplication() {
return mApplication;
}
//ContextWrapper,获取的也是当前的Application对象
public Context getApplicationContext() {
return mBase.getApplicationContext();
}
Application与Context关联
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DQteMCC-1603721125462)(https://github.com/wfeii/wfeii.github.io_raw_important/blob/master/AOSP/Context%E4%B8%8EActivity/Application%E4%B8%8EContenxt%E5%85%B3%E8%81%94.png?raw=true)]
每次启动新的进程后都会调用ActivityThread
的handleBindApplication
。(这里涉及到Activity的启动过程,不做过多的讲解)。
private void handleBindApplication(AppBindData data) {
......
Application app;
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
final StrictMode.ThreadPolicy writesAllowedPolicy = StrictMode.getThreadPolicy();
try {
app = data.info.makeApplication(data.restrictedBackupMode, null);
mInitialApplication = app;
······
try {
mInstrumentation.callApplicationOnCreate(app);
}
}
·····
}
ActivityThread
的handleBindApplication
有两个重要的方法调用
data.info.makeApplication
获取Application
对象mInstrumentation.callApplicationOnCreate(app)
调用Application
的onCreate
方法
获取Application对象
data.info.makeApplication
方法
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
//判断mApplication是否已经存在
if (mApplication != null) {
return mApplication;
}
Application app = null;
try {
//创建ContextImp对象
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
//创建Application对象
app = mActivity