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)的当前值。(感觉日常开发基本用不到);