Android:getApplicationContext()。getContentResolver()vs getContentResolver()之间的区别

时间:2017-03-09 15:41:38

标签: android android-context

这个问题的要点是要弄清楚什么时候有必要使用这个'或getApplicationContext()或获取Context的其他形式。实施例

Settings.System.putInt(getContentResolver(), Settings.System
                        .SCREEN_BRIGHTNESS_MODE, 0);

VS

Settings.System.putInt(getApplicationContext().getContentResolver(),
                        Settings.System.SCREEN_BRIGHTNESS_MODE, 0);

这两种功能有何不同?

2 个答案:

答案 0 :(得分:1)

“上下文是什么”这个问题是Android领域最难的问题之一。

Context定义了访问系统资源,检索应用程序的静态资产,检查权限,执行UI操作等的方法。从本质上讲,Context是生产中神对象反模式的一个例子。

当谈到我们应该使用哪种Context时,它变得非常复杂,因为除了作为God Object之外,Context子类的层次结构树残忍地违反了Liskov替换原则。

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               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
     
      
  1. 应用程序可以从此处启动活动,但需要创建新任务。这可能适合特定的用例,但可以在您的应用程序中创建非标准的堆栈行为,通常不建议或被视为良好实践。
  2.   
  3. 这是合法的,但通货膨胀将使用您运行的系统的默认主题,而不是您的应用程序中定义的内容。
  4.   
  5. 如果接收方为空,则允许在Android 4.2及更高版本上用于获取粘性广播的当前值。
  6.         

    - screenshot

至于getContentResolver()来电 - activity.getContentResolver()application.getContentResolver()是等效的(Activity将此次来电委托给Application

答案 1 :(得分:0)

在Android系统中,上下文可以是活动,服务或应用程序。当您从任何上下文中调用context.getApplicationContext();时,您将获得在Manifest中定义的Application类的上下文。由于Application类维护应用程序的全局状态,因此应用程序上下文在应用程序运行时(在前台或后台)可用。

  

当需要使用'this'或getApplicationContext()

当您需要绑定并在您的活动或服务中运行的操作的上下文时,使用this总是好的。另一方面,当您执行更具特定于应用程序且未受约束或依赖于调用的Activity / Service的内容时,您可以使用getApplicationContext(); 在您的情况下,您只是使用上下文获取一些上下文资源,因此在两种情况下都是相同的。当您将上下文传递给另一个知道该类将不时使用上下文时,会出现差异。