“上下文是什么”这个问题是Android世界中最困难的问题之一。
上下文定义了访问系统资源,检索应用程序的静态资产,检查权限,执行UI操作等等的方法。实质上,Context
是上帝对象在生产中的反模式的一个例子。
谈到我们应该使用哪一种Context
,它变得非常复杂,因为除了作为上帝对象之外,Context
子类的层次结构树残酷地违反了里斯科替换原则。
This blog post试图总结Context
类在不同情况下的适用性。
让我从后复制主表的完整性:
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog | NO | YES | NO | NO | NO |
| Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ |
| Layout Inflation | NO² | YES | NO² | NO² | NO² |
| 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 | NO³ |
| Load Resource Values | YES | YES | YES | YES | YES |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
- 应用程序可以从这里开始的活动,但它需要的是一个新的任务来创建。这可能适合特定的用例,但可以在应用程序中创建非标准的后退堆栈行为,通常不被推荐或被认为是良好的做法。
- 这是合法的,但通货膨胀将使用您正在运行的系统的默认主题来完成,而不是您应用程序中定义的内容。
- 在Android 4.2及以上版本中,如果接收方为空(用于获取粘性广播的当前值),则允许使用。
— screenshot
至于getContentResolver()
呼叫 - activity.getContentResolver()
和application.getContentResolver()
是等价的(Activity
代表此调用Application
引擎盖下)。
可能的重复:http://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and – Phil3992