1、Context是什么:
一、Context是维持Android程序中各组件可以正常工做的一个核心功能类,咱们选中Context类 ,按下快捷键F4,右边就会出现一个Context类的继承结构图啦,以下图所示:
看下我用红线标出来的地方,从这里能够看到Activity、Service、Application都是Context的子类;html
二、再来从源码角度看Context类:android
public abstract class Context { ...... }
从源码中咱们能够看见Context是个抽象类,里面定义了各类抽象方法,包括获取系统资源,获取系统服务,发送广播,启动Activity,Service等,结合上图也就是说Activity、Service、Application等都是Context类的一个实现。再仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper(上下文功能的封装类),而在ContextWrapper的源码中咱们能够看到,ContextWrapper内部会包含一个base context(这里就不贴出来了,你们去看源码便可),由这个base context去实现了绝大多数的方法。app
2、下面咱们来看一下在Android系统中Context类的继承结构: this
经过继承关系能够看到,Context直接子类为ContextIml(具体实现类)和ContextWrapper(上下文功能包装类),而ContextWrapper又有三个子类,分别是ContextThemeWrapper、Service和Application。基于Activity和Service、Application不在一个继承层级里,而是又继承了ContextThemeWrapper。细心的朋友看到ContextWrapper和ContextThemeWrapper这两个类的名字,相信你内心已经有了答案,对的,区别在Theme。ContextThemeWrapper是一个带主题的封装类,内部包含了主题(Theme)相关的接口,当Activity在启动的时候系统都会加载一个主题,也就是咱们在配置文件AndroidManifest.xml里面写的android:theme=”@style/AppTheme”的属性啦!(以下图所示),但是Service和Applicaton并不须要加载主题,所以他们继承自ContextWrapper。 spa
3、Application中的Context和Activity中的Context的区别
在须要传递Context参数的时候,若是是在Activity中,咱们能够传递this(这里的this指的是Activity.this,是当前Activity的上下文)或者Activity.this。这个时候若是咱们传入getApplicationContext(),咱们会发现这样也是能够用的。但是你们有没有想过传入Activity.this和传入getApplicationContext()的区别呢?首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这二者的生命周期是不一样的,它们各自的使用场景不一样,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这二者的生命周期是不一样的。getApplicationContext() 生命周期是整个应用,当应用程序摧毁的时候,它才会摧毁;Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它就摧毁。xml
4、Application中的Context和Activity中的Context各自的使用场景
Activity Context 和Application Context二者的使用范围存在着差别,具体以下图所示: htm
咱们就只看Activity和Application,能够看到前三个操做不在Application中出现,也就是Show a Dialog、Start an Activity和Layout Inflation。开发的过程当中,咱们主要记住一点,凡是跟UI相关的,都用Activity作为Context来处理。对象
5、Context数量
在建立Activity、Service、Application时都会自动建立Context,它们各自维护着本身的上下文。在Android系统中Context类的继承结构里面咱们讲到Context一共有Application、Activity和Service三种类型,所以若是要统计一个app中Context数量,咱们能够这样来表示:blog
Context数量 = Activity数量 + Service数量 + 1
这里要解释一下,上面的1表示Application数量。一个应用程序中能够有多个Activity和多个Service,但只有一个Application。可能有人会说一个应用程序里面能够有多个Application啊,个人理解是:一个应用程序里面能够有多个Application,但是在配置文件AndroidManifest.xml中只能注册一个,只有注册的这个Application才是真正的Application,才会调用到所有的生命周期,因此Application的数量是1。继承