Context 详解
一、概述
本篇文章,我们来分析一下 Android 中的 Context 体系。
二、类图
三、Context的使用场景
Context作用域 | Application | Activity | Service | ContentProvider | BroadcastReceiver |
---|---|---|---|---|---|
Show a Dialog | No | Yes | No | No | No |
Start a Activity | No1 | Yes | No1 | No1 | No1 |
Layout Inflation | No2 | Yes | No2 | No2 | No2 |
Start a Service | Yes | Yes | Yes | Yes | Yes |
Bind to a Service | Yes | Yes | Yes | Yes | No |
Send a Broadcast | Yes | Yes | Yes | Yes | Yes |
Register BroadcastReceiver | Yes | Yes | Yes | Yes | No3 |
Load Resource Values | Yes | Yes | Yes | Yes | Yes |
注意:
-
No1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
-
No2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
-
No3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)
-
ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。
1. 在一个应用中,存在多少个Context
total(Context) = m(Activity) + n(Service) + 1(Application);
为什么没有ContentProvider和BroadcastReceiver?
- ContentProvider:在ContentProvider中可以通过 getContext() 获取Context对象;
- BroadcastReceiver:在 roadcastReceiver 的 onReceiver() 中会得到一个Context对象,该对象是ReceiverRestrictedContext的一个实例;
- 总结:ContentProvider 和 BroadcastReceiver 的 Context 都直接或间接来自于Application、Activity和Service;