Context 是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环
境基础信息。
Context 下有两个子类,ContextWrapper 是上下文功能的封装类,而ContextImpl
则是上下文功能的实现类。
而ContextWrapper 又有三个直接的子类,ContextThemeWrapper、
Service 和Application。其中,ContextThemeWrapper 是一个带主题的封装类,而它有一个直
接子类就是Activity,所以Activity 和Service 以及Application 的Context 是不一样的,只有
Activity 需要主题,Service 不需要主题。
Context 一共有三种类型,分别是Application、Activity
和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context 的一种,而它
们具体Context 的功能则是由ContextImpl 类去实现的,因此在绝大多数场景下,Activity、
Service 和Application 这三种类型的Context 都是可以通用的。
不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android 是不允许Activity 或Dialog凭空出现的,一个Activity 的启动必须要建立在另一个Activity 的基础之上,也就是以此形成的返回栈。
而Dialog 则必须在一个Activity 上面弹出(除非是System Alert 类型的Dialog),
因此在这种场景下,我们只能使用Activity 类型的Context,否则将会出错。
getApplicationContext()和getApplication()方法得到的对象都是同一个application 对象,只是
对象的类型不一样。
Context 数量= Activity 数量+ Service 数量+ 1 (1 为Application)