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相关的类

android 上下文理解 安卓上下文_java

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中