2017-03-09 21 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引擎蓋下)。

相關問題