Android中的上下文Context
- Android中的上下文Context
- 一.与Context相关的类
- 1.ContextImpl
- 2.ContextWrapper
- 3.ContextThemeWrapper,Service,Application
- 4.Activity
- 二.Application的Context创建过程
- LoadedApk.java中makeApplication方法的执行过程:
- Instrumentation.java中newApplication方法的执行过程:
- Application.java中attach方法的执行过程:
- ContextWrapper.java中attachBaseContext方法的执行过程:
- 三.Application中Context的获取过程
- ContextWrapper.java中getApplicationContext方法执行过程:
- ContextImpl.java中getApplicationContext方法的执行过程:
- LoadedApk.java中getApplication方法的执行过程:
- 四.Activity的Context创建过程
- ActivityThread.java中performLaunchActivity方法执行过程:
- Activity.java中attach方法执行过程:
- ContextThemeWrapper.java中attachBaseContext方法的执行过程:
- ContextWrapper.java中attachBaseContext方法的执行过程:
- 五.Service的Context创建过程
- ActivityThread.java中handleCreateService方法的执行过程:
- Service.java中attach方法的执行过程:
- ContextWrapper.java中attachBaseContext方法的执行过程:
Android中的上下文Context
上下文Context是一个应用程序环境信息的接口。
使用场景:
1).使用Context对象调用方法
2).调用其它方法时,传入Context对象作为参数
Activity、Service、Application间接的继承Context。应用程序进程中Context的数量为Activity的数量加Service的数量加Application的数量。一个应用程序进程的Application只有一个。
一.与Context相关的类
1.ContextImpl
继承自Context,是Context的实现类
2.ContextWrapper
继承自Context,是ContextImpl的包装类,内部将ContextImpl对象保存在类型为Context的成员变量mBase,大部分方法通过调用ContextImpl的相应方法实现。
3.ContextThemeWrapper,Service,Application
继承自ContextWrapper,通过ContextImpl对象调用Context方法,在ContextWrapper的基础上添加了不同的功能。
4.Activity
继承自ContextThemeWrapper,ContextThemeWrapper中包含与主题相关的方法,因此Activity继承ContextThemeWrapper。
二.Application的Context创建过程
当启动Activity时,最后会调用performLaunchActivity方法,该方法内部会调用LoadedApk对象的makeApplication方法来创建Application对象。
LoadedApk.java中makeApplication方法的执行过程:
1.若Application存在,则直接返回
2.若Application不存在,
1).调用ContextImpl的createAppContext方法,创建ContextImpl对象
2).调用Instrumentation对象的newApplication方法,传入ContextImpl对象,创建Application对象
3).调用ContextImpl对象的setOuterContext方法,传入Application对象,将Application对象保存在ContextImpl中类型为Context的成员变量mOuterContext中
4).将Application对象保存在LoadedApk对象的类型为Application的成员变量mApplication中
5).返回Application对象
Instrumentation.java中newApplication方法的执行过程:
1.通过反射创建Application对象
2.调用Application对象的attach方法,传入Context对象。
Application.java中attach方法的执行过程:
调用attachBaseContext方法,传入Context对象
该方法在Application的父类ContextWrapper中实现
ContextWrapper.java中attachBaseContext方法的执行过程:
将Context对象保存在类型为Context的变量mBase中
三.Application中Context的获取过程
一般调用getApplicationContext方法获取Application的Context对象
该方法在ContextWrapper中实现
ContextWrapper.java中getApplicationContext方法执行过程:
调用ContextImpl对象的getApplicaitionContext方法
ContextImpl.java中getApplicationContext方法的执行过程:
1.若LoadedApk对象不为空,则调用LoadedApk对象的getApplication方法获取
2.若LoadedApk对象为空,则调用ActivityThread对象的getApplication方法
当应用程序启动后,LoadedApk对象不为空
LoadedApk.java中getApplication方法的执行过程:
返回内部保存的Application对象
四.Activity的Context创建过程
当启动Activity时,最后会调用performLaunchActivity方法。
ActivityThread.java中performLaunchActivity方法执行过程:
1.调用createBaseContextForActivity方法,创建ContextImpl对象
1).调用ContextImpl的createActivityContext方法
2.调用Instrumentation对象的newActivity方法,传入Context对象,创建Activity对象。
3.调用ContextImpl对象的setOuterContext方法,传入Activity对象,将创建的Activity对象保存在Context中类型为Context的成员变量mOuterContext
4.调用Activity对象的attach方法,传入ContextImpl对象
5.调用Instrumentation对象的callActivityOnCreate方法,该方法会调用Activity对象的onCreate方法。
Activity.java中attach方法执行过程:
1.调用attachBaseContext方法,传入Context对象
2.创建PhoneWindow对象
3.调用PhoneWindow对象的setCallback方法
4.调用Context对象的getSystemService获取WMS对象,再调用PhoneWindow对象的setWindowManager方法,传入WMS对象
5.调用PhoneWindow对象的getWindowManager方法获取WindowManager对象,并保存到类型为WindowManager的变量mWindowManager中
ContextThemeWrapper.java中attachBaseContext方法的执行过程:
调用父类的attachBaseContext方法
ContextWrapper.java中attachBaseContext方法的执行过程:
将Context对象保存在类型为Context的变量mBase中
五.Service的Context创建过程
启动Service时,最终会调用handleCreateService方法
ActivityThread.java中handleCreateService方法的执行过程:
1.调用ContextImpl的createAppContext方法,创建ContextImpl对象
2.调用Service对象的attach方法,传入ContextImpl对象
Service.java中attach方法的执行过程:
调用attachBaseContext方法
ContextWrapper.java中attachBaseContext方法的执行过程:
将Context对象保存在类型为Context的变量mBase中