本篇文章分为四个章节:一、Context是什么?;二、Context相关类整体结构;三、四大组件Context初始化(&ApplicationContext);四、Context相关问题;
一、Context是什么?
一个Context意味着一个场景,一个场景就是用户和操作系统交互的一种过程。比如当你打电话时,场景包括电话程序对应的界面,以及隐藏在界面后的数据:当你看短信时,场景包括短信界面,以及隐藏在后面的数据。
从语义的角度来审视一下Context,Android程序员把“场景”抽象为Context类,用户和操作系统的每一次交互都是一个场景,比如打电话、发短信,这些都是有界面的场景,还有一些没有界面的场景,比如后台运行的服务(Service),一个应用程序可以认为是一个工作环境,用户在这个工作环境中会切换到不同的场景,这就像一个前台秘书,她可能需要接待客户,可能要打印文件,还可能要接听客户电话,而这些就称之为不同的场景,前台秘书可称之为一个应用程序。
从代码的角度看,Context就是一个抽象类,Activity类的确是基于Context,而Service类也是基于Context,Activity除了基于Context类以外,还实现了一些其他重要接口,从设计的角度来看,interface仅仅是基于某些功能,而extends才是类的本质,即Activity的本质是一个Context,其所实现的其他接口只是为了扩充Context的功能而已,扩充之后的类称之为一个Activity或者Service。
二、Context相关类整体结构
Context类本身是一个纯抽象类。
为了使用方便,又定义了ContextWrapper类,如其名所言,只是一个包装而已,ContextWrapper构造函数中必须包含一个真正的Context引用,同事ContextWrapper中提供了attachBaseContext()用于给ContextWrapper对象中指定真正的Context对象,调用ContextWrapper的方法都会被转向其所包含的真正的Context对象。
ContextThemeWrapper类,其内部包含了与主题(Theme)相关的接口,这里所说的主题就是指在AndroidManifest.xml中通过android:theme为Application元素或者Activity元素指定的主题。当然,只有Activity才需要主题,Service是不需要主题的,因为Service是没有界面的后台场景,所以Service直接继承于ContextWrapper。
ContextImpl类真正实现了Context中所有的函数,应用程序中所调用的各种Context类的方法,其实现均来自于该类。
由上面的整体结构图也可以得到一个问题的答案:
一个应用程序中包含多少个Context对象?
Context个数 = Service个数+ Activity个数 + 1(Application)
更多内容 >> 阅读原文