2012-05-01 72 views
2

Android API中的幾個類在其構造函數中需要參數Context,例如ArrayAdapter,SQLiteOpenHelperIntent。從Activity內部創建這樣一個對象時,哪個上下文實例更適合傳遞給它們:this(活動實例本身)還是活動的getApplicationContext()方法返回的對象,爲什麼?從活動傳遞給非活動構造函數的上下文實例?

到目前爲止,我已經使用了兩者,並沒有看到在結果功能上的任何區別。有什麼經驗法則嗎?

回答

2

getApplicationContext()方法的文檔:

返回的 當前進程的單一的全球應用程序對象的上下文。這通常只適用於需要生命週期與當前上下文分離的 上下文,即與進程的生命週期相關的 ,而不是當前組件。

考慮例如這如何與{@ #registerReceiver(廣播接收器,IntentFilter的)}交互:

  • 如果從一個活動上下文中使用,所述接收器正在註冊 內的活動。這意味着在活動完成銷燬之前,您需要取消註冊 ;事實上,如果您不這樣做 ,框架將清理您的泄漏註冊,因爲它會刪除 活動並記錄錯誤。因此,如果您使用活動上下文 來註冊一個靜態的接收器(對進程是全局的,而不是與活動實例關聯的 ),那麼在您使用的活動被銷燬的任何時間點上,您將刪除該註冊的 。

  • 如果從在此返回的上下文中使用,則接收者正在註冊與您的應用程序關聯的全局狀態 。 因此,它永遠不會被註銷。如果 接收器與靜態數據相關聯,而不是特定組件,則這是必需的。 但是使用ApplicationContext的其他地方也容易導致嚴重 泄漏,如果你忘了註銷,解除綁定等

相關問題