类图:
context.jpg1.
Context类本身是一个纯abstract类,它有两个具体的实现子类:ContextImpl和ContextWrapper。
ContextWrapper是包装类, 调用ContextWrapper的方法都会被转向其所包含的真正的ContextImpl对象。
2.
ContextThemeWrapper类,如其名所言,其内部包含了与主题(Theme)相关的接口,这里所说的主题就是指在AndroidManifest.xml中通过android:theme为Application元素或者Activity元素指定的主题, 当然,只有Activity才需要主题,Service是不需要主题的,因为Service是没有界面的后台场景,所以Service直接继承于ContextWrapper,Application同理。
3.
一个应用程序有几个Context?
Context数量=Activity数量+Service数量+1
可能会有疑问:我们常说四大组件,这里怎么只有Activity,Service持有Context,那Broadcast Receiver,Content Provider呢?Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context都是其他地方传过去的,所以并不计入Context总数。
4.
Context能干什么?
弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等都需要用到Context.
在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。
出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
一句话总结:凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以.
5.
static对象不要持有Activity Context对象, 否则导致Activity退出时(onDestroy()被调用), Activity Context对象无法被销毁.
static对象应该持有和static对象同生命周期的Application Context对象.
refer to:
http://gold.xitu.io/entry/573b27e7df0eea005e71c425
网友评论