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中

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 类和 Json对象
  3. Python list sort方法的具体使用
  4. python list.sort()根据多个关键字排序的方法实现
  5. 初学Android,五大布局对象(六)
  6. android ui事件分析
  7. Android(安卓)DownloadManager 的使用
  8. selector下的按钮介绍
  9. Android屏幕旋转时Activity不重新调用onCreate的方法

随机推荐

  1. android四大组件
  2. Android Studio - 第四十二期 几个经常用
  3. android(NDK+JNI)---NDK编译生成so文件
  4. Handler机制及四个组成部分
  5. Android修改字体样式的示例代码
  6. Android调用系统Email发送邮件
  7. android java.lang.IllegalArgumentExcep
  8. Xamarin C# Android for Visual Studio
  9. android检查手机和无线是否连接的方法
  10. android 权限及原理