Context总结

在Android开发中,随处可见Context的身影,包括Activity,Service,Application等都是Context的子类,在很多情况下,例如show一个Dialog,获取资源文件,启动一个Activity等等,我们都需要通过Context来完成。这里,对Context体系做一个简单的总结。

Context

Context是一个抽象类,字面意思是环境,上下文等等,定义了一些基础抽象方法。

ContextImpl

Context的实现类,实现了大量的基础方法,ContextImpl持有对ActivityThread的引用,有许多方法要通过ActivityThread的帮助来实现。ContextImpl针对不同的组件创建不同的实例,例如为Activity创建实例时,需要Token作为参数,而这个Token则是和WindowManagerService交互的通行证,所有只有Activity的context才能进行弹窗等操作。

ReceiverRestrictedContext

和ContextImpl定义在同一个文件中,这个类继承于ContextWrapper,起到禁止绑定Service和注册广播的功能。

当定义静态广播时,不管是应用内还是全局广播,onReceived方法返回的context是ReceiverRestrictedContext。

对于全局广播的动态注册,回调onReceive中的context是:Activity Context。

顺便说说BroadcastReceiver:

LocalBroadcastManager可以用于创建应用内广播,或者export设为false。

应用内广播的动态注册(LocalBroadcastManager方式),context是Application context

应用内广播的动态注册(非LocalBroadcastManager方式),context是Activity context

有序广播按照Priority从大到小排序,相同的Priority,动态广播优先

粘性广播5.0以后已被废弃,不多加讨论。

ContextWrapper

ContextImpl的装饰类,持有对ContextImpl的引用,只是对ContextImpl的方法做了下代理,没有多余的装饰动作

ContextThemeWrapper

ContextWrapper的子类,增加了一些装饰动作,getResource被修饰了

Activity

继承于ContextThemeWrapper,四大组件之一,不仅仅有Context定义的基础功能,还实现了对window进行监听的接口

Application

Application继承于ContextWrapper,是应用中生命周期最长的一个类,我们平时调用context.getApplicationContext返回的实际就是Application本身.Application被ActivityThread所引用,而ActivityThread又被ContextImpl所引用,所以我们可以获取到。

Service

Service也是继承于ContextWrapper,并且也实现了ComponentCallbacks2接口,这点和Application一致

总结

Context为我们提供了很多方便和系统进行交互的接口,正如其字面意思,它是一种环境,通过它我们能拿到资源文件,启动Activity,启动或绑定Service,获取ContentProvider服务,动态注册广播等等,是一个很强大的工具类。几乎所有Context都是在ActivityThread中进行实例化的。

文章目录
  1. 1. Context
  2. 2. ContextImpl
  3. 3. ReceiverRestrictedContext
  4. 4. ContextWrapper
  5. 5. ContextThemeWrapper
  6. 6. Activity
  7. 7. Application
  8. 8. Service
  9. 9. 总结
|