5分钟理解Android中的上下文!!!

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中

发布了12 篇原创文章 · 获赞 5 · 访问量 2250

猜你喜欢

转载自blog.csdn.net/LeeDuoZuiShuai/article/details/104093894