1、Context介绍
Context在Android中表示上下文对象,也是开发中经常使用的类,如资源的获取、View的创建、窗口创建添加等,在Android的四大组件中也随处可见Context的身影,也是Context使用的主战场,可以说Context的重要程度非一般类可比,但很多人对其内部结构并不是很熟悉,最基本的将、经常使用的却不一定熟悉,是不是有点灯下黑的感觉,本篇文章就针对context在Android中的使用进行学习;
按照实际开发的使用场景来说,Context一般分两种:
- 使用Context调用方法,如Activity的启动、ContentProvider等
- 调用方法时传入context,如创建Dialog、View的创建等
- Context的继承关系
这里先给出Android中Context的继承关系图,总结如下:
- ContextImpl和ContextWrapper都继承了Context,在ContextWrapper内部保存这ContextImpl的对象mBase;
- ContextThemeWrapper、Service、Application都继承于ContextWrapper,它们内部都可以通过mBase使用ContextImpl的方法;
- Activity继承ContextThemeWrapper类,因为ContextThemeWrapper扩展了Context的方法;
2、Application中Context创建和获取
由Android进阶知识树——Android四大组件启动过程知道,程序进程启动后会执行到ActivityThread.handleBindApplication()中,其中就包含创建Application对象
Application app = r.packageInfo.makeApplication(false, mInstrumentation); //创建了Application并调用onCreate()初始化
2.1、Context创建过程
- makeApplication():创建Application对象,调用onCreate()
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
appClass = "android.app.Application";
try {
java.lang.ClassLoader cl = getClassLoader();
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication( //调用Instrumentation创建Application
cl, appClass, appContext);
appContext.setOuterContext(app);//
}
return app;
}
- ContextImpl.createAppContext()
static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
null);
context.setResources(packageInfo.getResources());
return context;
}
在上面方法中直接创建了ContextImpl对象,并初始化ContextImpl对象中的Resou