Context详解

来源:互联网 发布:多益 知乎 编辑:程序博客网 时间:2024/06/01 10:19

Context概念

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应用程序的环境,它声明了一系列的接口,主要用于获取资源(Assets、Resources等)、启动四大组件、检查权限和获取服务等。

Context是个抽象类,Application、Activity、Service等都是它的子类。具体可以看Context相关类的继承关系:

Context相关类的继承关系
图是网上找的,有点错误。

可能只看这些还是不能理解Context的概念,接下来我们打个比方。

  1. 假设Context代表人类,人类也是一个抽象的概念,人类会进食、会看、会说、会繁衍后代、会死亡等各种能力就相当于Context中的获取资源、启动四大组件、获取服务等等。
  2. ContextImpl代表男人和女人,男人和女人都有上面的那些能力而且实现上面能力会有所不同,只不过安卓中实现Context能力的方式都一样所以只要一种ContextImpl就够了。
  3. ContextWrapper代表人类的群体,比方说中国人,让你请一个中国人吃饭,肯定是请你的某个好友(假设是中国人),而你的好友就相当于ContextWrapper中的mBase。让你请一个中国人吃饭实际上是请你的好友吃饭,调用ContextWrapper的方法实际上是调用mBase的方法。ContextWrapper虽然继承了Context,但是他自己不实现,而是由内部的mBase代劳。
  4. ContextThemeWrapper相当于有特殊技能的中国人,对于ContextThemeWrapper而言,特殊技能就是有主题(Theme)。
  5. Activity、Service、Application就相当于更具体的个人,只不过Activity是个明星,需要抛头露面,所以需要界面来展示,而且能量最大,能做的事情最多。而Service和Application是个默默无闻的地下党,不需要什么界面,只要能工作就行,Application又比较特殊,他是个地下党头目,一个组织只有一个头目,只不过他是幕后老板,所以抛头露面的事他不做,而且他还和其他人关系密切。

比喻可能不是很恰当,这里主要是说明Context与他们的关系。

Context的应用场景

这里写图片描述

大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:
数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)
注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。

0 0
原创粉丝点击