在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中进行实例化的。