2017-03-09 17 views
2

这个问题的主要观点是澄清何时有必要使用'this'或getApplicationContext()或其他形式获取上下文。防爆。Android:getApplicationContext()。getContentResolver()与getContentResolver()之间的区别只是getContentResolver()

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

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

有多么这两个函数的区别吗?

+2

可能的重复:http://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and – Phil3992

回答

0

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

当需要使用“本”或getApplicationContext()

当你需要它绑定并运行你的活动或服务中的作用的背景下,它总是很好用this 。另一方面,当你执行更具体的应用程序,并且没有绑定或依赖于调用活动/服务时,你可以使用getApplicationContext(); 就你而言,你使用你的上下文来获得一些上下文资源,所以这两种情况都是一样的。当你将上下文传递给另一个类时,会发生不同,因为知道类将不时地使用上下文。

+0

您的回答既不足以涵盖Context的功能(详见@ phil3992) ,也不涉及'getContentResolver()'的具体细节。调用 – Vasiliy

+0

功能相同。所有这三个上下文(Application,Activity,Service)都提供了相同的功能,因为它们继承了同一个类。 –

+0

而且问题并不是要求解析器getContentResolver会返回什么内容,显然它们会返回相同的结果。问题是要知道什么时候使用哪个,我写的是 –

1

“上下文是什么”这个问题是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    | 
+----------------------------+-------------+----------+---------+-----------------+-------------------+ 
  1. 应用程序可以从这里开始的活动,但它需要的是一个新的任务来创建。这可能适合特定的用例,但可以在应用程序中创建非标准的后退堆栈行为,通常不被推荐或被认为是良好的做法。
  2. 这是合法的,但通货膨胀将使用您正在运行的系统的默认主题来完成,而不是您应用程序中定义的内容。
  3. 在Android 4.2及以上版本中,如果接收方为空(用于获取粘性广播的当前值),则允许使用。

screenshot

至于getContentResolver()呼叫 - activity.getContentResolver()application.getContentResolver()是等价的(Activity代表此调用Application引擎盖下)。

相关问题