05 理解上下文Context

2019/03/27 posted in  Android进阶解密

5.1 Context的关联类

从图中我们可以看出,ContextImpl和ContextWrapper继承自Context,ContextWrapper内部包含有Context类型的mBase对象,mBase具体指向的是ContextImpl。ContextImpl提供了很多功能,但是外界需要使用并拓展ContextImpl的功能,因此设计上使用了装饰模式,ContextWrapper是装饰类,它对ContextImpl进行包装,ContextWrapper主要是起了方法传递作用,ContextWrapper中几乎所有的方法实现都是调用ContextImpl的相应方法来实现的。ContextThemeWrapper、Service和Application都继承自ContextWrapper,这样他们都可以通过mBase来使用Context的方法,同时它们也是装饰类,在ContextWrapper的基础上又添加了不同的功能。ContextThemeWrapper中包含和主题相关的方法(比如: getTheme方法),因此,需要主题的Activity继承ContextThemeWrapper,而不需要主题的Service则继承ContextWrapper。

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

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

5.2 Application Context的创建过程

5.3 Application Context的获取过程

5.4 Activity的Context创建过程

5.5 Service的Context创建过程

5.6 本章小结