Android Context种类及区别

1前言

Service和Activity、Application都是继承Context的,那么它们的Context有什么区别?你知道吗?

2 从源码中找答案

看下Activity和Service分别继承是哪个Context:

image.png
image.png

Activity继承的ContextThemeWrapper又是啥,点击进去一看:

image.png

原来它也是继承ContextWrapper,然后从注释来上看该类内部包含了主题Theme相关的东西。说到主题,还记得AndroidManifest.xml里面给Activity设置android:theme属性吗?这个就是他们的Context主要不同之处了,Service运行在后台,它没有界面就不需要主题属性,但是Activity运行在前台的界面,它需要一个界面的主题属性。

3 Context继承关系

了解了ServiceActivityContext继承差异后,我们再把所有的Context继承关系梳理出来,这样对整体Context才会有更清晰的认知。

android.content.Context继承关系如下:

图片.png

图片.png

Context整体结构图如下:


图片.png

Context主要就两个子类,ContextImpl它真正实现了Context里面全部方法,ContextWrapper构造函数中有一个Context的对象,同时ContextWrapper中提供了attachBaseContext(),这个方法用于传入一个真正的Context对象(ContextImpl的实现对象)。

4 Context使用场景

我们知道四大组件中都有Context,那么它们中的Context分别的使用场景是什么呢?先来看一张网上流传很久的图:

image

表格中的标注1,2,3数字,这里说明一下:

1:只有Activity中的Context才能直接启动一个Activity。若使用其他Context启动Activity,需要创建一个Task来启动,通常代码设置setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用;

3:在Receivernull时允许,在4.2或以上的版本中,用于获取黏性广播( sticky broadcast)的当前值。(感觉日常开发基本用不到);

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容