「上下文是什麼」這個問題是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