1前言
Service和Activity、Application都是继承Context的,那么它们的Context有什么区别?你知道吗?
2 从源码中找答案
看下Activity和Service分别继承是哪个Context:
Activity继承的ContextThemeWrapper又是啥,点击进去一看:
原来它也是继承ContextWrapper
,然后从注释来上看该类内部包含了主题Theme
相关的东西。说到主题,还记得AndroidManifest.xml
里面给Activity
设置android:theme
属性吗?这个就是他们的Context
主要不同之处了,Service
运行在后台,它没有界面就不需要主题属性,但是Activity
运行在前台的界面,它需要一个界面的主题属性。
3 Context继承关系
了解了Service
和Activity
的Context
继承差异后,我们再把所有的Context
继承关系梳理出来,这样对整体Context才会有更清晰的认知。
android.content.Context
继承关系如下:
Context整体结构图如下:
Context
主要就两个子类,ContextImpl
它真正实现了Context
里面全部方法,ContextWrapper
构造函数中有一个Context
的对象,同时ContextWrapper
中提供了attachBaseContext()
,这个方法用于传入一个真正的Context
对象(ContextImpl
的实现对象)。
4 Context使用场景
我们知道四大组件中都有Context
,那么它们中的Context
分别的使用场景是什么呢?先来看一张网上流传很久的图:
表格中的标注1,2,3
数字,这里说明一下:
1:只有Activity
中的Context
才能直接启动一个Activity
。若使用其他Context
启动Activity
,需要创建一个Task
来启动,通常代码设置setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
2:在这些类中去layout inflate
是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用;
3:在Receiver
为null
时允许,在4.2
或以上的版本中,用于获取黏性广播( sticky broadcast
)的当前值。(感觉日常开发基本用不到);