一、组件对Context继承关系
可以看到Activity、Service、Application都是Context的子类;
注意:广播是个普通对象,没有继承Context,只是在onReciever参数中可以获取
总结:
①Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。
②Service和Application继承的是ContextWrapper、Activity继承自ContextThemeWrapper,因此,acitivty在加载布局时回自动选择Manifest配置的主题。而Service和Application无法选择主题
③Application的Context并不一定适合做所有任务
二、用法总结
在仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper,而ContextWrapper内部会包含一个base context,由这个base context去实现了绝大多数的方法。
大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:
数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)
三、getApplicationContext()与getContext()区别
①同一个Activity中,getContext()实际上和Activity.this是同一个对象。
②getApplicationContext()实质是Application对象。