目录
  1. 1. 前言
  2. 2. Context关联类
    1. 2.1. Application Context的创建
    2. 2.2. Activity Context的创建
    3. 2.3. Service Context的创建
重拾Android-【吃透源码系列】之Context

Context 也就是上下文对象,是Android很常见的类,但是对于Context,之前一直都是处于会用的阶段,本篇打算从源码的角度来分析Context,从而彻底掌握它。

前言

Android中的四大组件都会涉及Context,比如 Activity 的启动,Service 的启动等等,如果跟过Activity启动的源码,相信了解AMS在通知Zygote进程创建应用程序进程之后,通知启动Activity(假设是根Activity),会在ActivityThread中通过 createBaseContextForActivity 创建应用的上下文对象,而 ContextWrapperContextImpl 就是 COntext的关联类,理解这些Context的关联类可以更好的理解四大组件的工作过程。接下来开始吧

Context关联类

首先来看一张类图关系,如下:

上面这张类图可以看到,ContextWrapper 和 ContextImpl 继承自 Context,ContextWrapper内部包含Context类型的mBase对象,其具体指向 ContextImpl。ContextImpl 提供了很多功能,但是外界需要使用并拓展了ContextImpl,这是一种很典型的装饰模式,ContextWrapper 是装饰类,它把 ContextImpl 包装了起来,ContextWrapper 主要是起了方法传递的作用,这里面几乎所有的方法都是调用 ContextImpl 的相应的方法来实现的。

ContextThemeWrapper、Service、Application都是继承自ContextWrapper,这样都可以通过mBase来使用Context内的方法,同时它们也是装饰类,在ContextWrapper基础上有拓展了不同的功能。

ContextThemeWrapper中包含和主题相关的方法(比如getTheme方法),因此主题的Activity继承ContextThemeWrapper,而不需要主题的Service则继承自ContextWrapper。

Context的关联类采用了装饰模式,主要有以下优点:

  • 使用者(比如Activity)能够更方便的使用Context;
  • 如果ContextImpl发生了变化,它的装饰类ContextWrapper不需要做任何修改
  • ContextImpl的实现不会暴露给外部使用者,使用者不需要关心ContextImpl的具体实现
  • 通过组合而非继承的方式,拓展ContextImpl的功能,在运行时选择不同的装饰类,从而可以实现不同的功能。

Application Context的创建

我们通过调用 getApplicationContext 来获取应用程序的全局的上下文环境,那么就从这里开始。之所以在应用程序中可以调用此获取方法,归根结底还是要了解Activity的创建过程,这里可以参考之前的文章《吃透源码系列之Activity》。

Activity Context的创建

Service Context的创建

打赏
  • 微信
  • 支付宝

评论