Context的理解

Android官网关于context的介绍:
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
中文翻译:context是一个应用环境上下文信息接口。它是一个抽象类,具体的实现在Android系统中。它提供了一个通道让我们可以获取应用程序的资源和类,我们也可以通过它做一些应用级别的操作如启动Activity,发广播,接收intent等。

Context的本意是上下文。上下文这个词很不好理解,可以用“条件“,“准备“来代替。
举例说明:我们经常在开发完一整套系统后要给领导进行演示,这一整套系统中可能包括系统A、系统B、系统C。在进行系统演示前我们需要进行准备,我们要准备一个会议室,一个投影仪,一个笔记本电脑,笔记本电脑上需要装上这一整套系统需要的其它软件以及演示需要的软件,可能还有一些其它硬件设备。
这所有的“准备”就是Context。这里的系统A,系统B相当于Activity,Service之类。
“Interface to global information about an application environment. ”,也正是因为Context就是这所有的“准备”,所以它也是这些“准备”信息的接口,通过它我们也就可以拿到这些信息。

Android中的Context有哪些

看一下Context的结构图:

android文本上下排列 安卓上下文_Android


1.ContextWrapper是一个包装类,对Context的真正实现进行了一个包装(持有ContextImp对象),调用ContextWrapper中的方法最终都会转向ContextImp。

2.ContextImp是Context的实现类,这个实现类在Android系统中,Android SDK中是没有这个类的。

3.ContextThemeWrapper是在ContextWrapper之上包含了与主题相关的接口,这个主题就是在AndroidManifest.xml中通过android:Theme属性配置的(可以给Activity或者Application指定主题)。

4.Activity是前台界面,需要主题,所以继承自ContextWrapper。

5.service是后台运行的,不需要主题,所以继承自ContextWrapper。

6.Application也是没有界面的,继承自ContextWrapper(虽然可以给Application配置主题,这其实可以理解为对所有Activity配置主题的一个便捷配置)。

Android Context数量:Activity+Service+Application(Application一般情况下就是1)

Context的作用

android文本上下排列 安卓上下文_Context_02


1.Application和Service也是可以启动Activity的,只是它们没有任务栈,在新建Activity时需要新建新的任务栈。

2.使用Application和Service去调用Layout inflate会导致使用系统默认的主题,你的某些样式可能不会被应用(和你预期要显示的界面可能会不一样)。

如何获得Context对象

1.Activity和Service类本身获得Context对象,通过this就可以。
2.view.getContext(),获取view运行其中的Context,通常是这个View运行的Activity。
3.context.getApplicationContext(),获取应用进程的Context对象。
注意:getApplication()也可以获取应用进程的Context对象,与getApplicationContext()是等价的。之所以要提供两个这样的方法是因为getApplication只能在Activity和Service中使用。
4.ContextWrapper.getBaseContext(),这个方法获取的是ContextImp对象。
注意:Context的具体实现都是由ContextImp去完成的,比如getResource(),getSystemService()等常用方法,虽然Activity,Service,Application也是具体的实现类,但是它们都没有去具体实现Context中的方法。

Context使用的注意事项

问题:将Activity对象当做Context对象传递给了一个生命周期较长的对象(比如一个单例对象,一个static对象),导致Activity无法被回收,引发内存泄露。
解决方案:使用Application作为Context对象传递。