android 技术梳理

理解 Android 的 Context

2021-01-15  本文已影响0人  jkwen
Context 是什么

可以理解为应用环境上下文,用来获取一些公共资源,例如资源文件,应用包信息等;或者用来启动 Activities, 注册广播监听器,发送广播等。

四大组件中只有 ActivityService 继承了 Context,所以如果要算应用里的 Context 的实例数量,应该是 Activity 的实例个数 + Service 的实例个数 + Application 的实例个数。

内容更新自2021/02/19
其实后来我有看到对这个数量的不同解释,说需要再乘以 2。因为 Activity 继承自 ContextWrapper,而后者内部又包含一个 Context 类型的 mBase 变量。然后觉得挺疑惑的,到底应该有几个呢?后来看到这篇文章我觉得理解的还可以,源码分析->一个应用到底有几个Context 其实两个值应该都算对。

Context 实现类有何区别

ContextWrapper 是 Context 的代理实现类,包含一个 Context 类型的成员变量 mBase,提供的代理方法都是通过 mBase 实现的。mBase 通过构造方法或者调用 attachBaseContext(Context base) 赋值。

Activity 直接继承自 ContextThemeWrapper,而 ContextThemeWrapper 又直接继承自 ContextWrapper,所以 Activity 间接继承自 Context。

Service 直接继承自 ContextWrapper,所以 Service 间接继承自 Context。

Application 直接继承自 ContextWrapper,所以 Application 间接继承自 Context。

所以都能通过 getBaseContext() 方法获取到 mBase。

相对于 Activity,Service 和 Application 在 mBase 赋值实现上略有不同,他们通过 attach(Context context) 方法内部调用 attachBaseContext(Context context);其次,Activity 主要用于页面的展示和与用户的交互,因此与 UI 相关的 context 使用应该用 Activity 的,例如弹出 Dialog,启动 Activity 等。

方法 getApplicationContext() 是在 ContextWrapper 里实现的,并且没有再在子类中重写,所以在这三者中调用实际上就是调用 mBase 的同名方法。如果要谈区别就要看 mBase 各自的具体实例的区别了。方法 getApplication() 只有在 Activity,Service 中才有,其表示的意思应该就是应用当前的 Application 实例。

参考文章
你真的懂 Context 吗?

上一篇下一篇

猜你喜欢

热点阅读