2012-02-02 59 views
18

我可以使用ApplicationContextSharedPreferences一起使用嗎?例如,RemoteServiceSharedPreferences的應用程序上下文?

從邏輯上講,我認爲我可以。這種方法有沒有細微差別?

+3

這個問題有什麼問題? 它太虛擬嗎? – user1074896 2012-02-02 10:55:27

+0

認爲有沒有人看到誰可以給出答案:( – 2012-03-30 16:07:15

+0

看看這個,它可能有所幫助:http://stackoverflow.com/questions/987072/using-application-context-everywhere – 2012-03-30 16:10:03

回答

1

是的,你可以使用getApplicationContext()。您可以在活動或服務中使用getBaseContext()this關鍵字的任何地方使用getApplicationContext(),但非特定情況下(例如將視圖或對話框添加到UI時)除外。

Here是關於什麼是上下文和什麼是一個很好的文章,我肯定會建議通過。

10

您應該使用ActivityServiceContext,即'this',除非您有明確的理由不要。如果您明確需要參考應用程序的全局狀態,請僅使用ApplicationContext

從上ContextWrapper'sgetApplicationContext()方法Android開發者API文檔:

這通常如果你需要一個上下文的生命週期是從當前上下文獨立的,才應使用,這是聯繫在一起的過程的生命週期,而不是當前組件。

使用的ApplicationContext(......)[而不是例如一個活動或服務上下文]可以很容易地導致嚴重的泄漏如果忘記註銷,解除綁定等

例如,在一個Activity檢索SharedPreferences到例如更改顯示給用戶的數據,使用this.getSharedPreferences(...),因爲沒有明確的理由說明爲什麼需要進入應用程序的生命週期。同樣,在Service中,使用this.getSharedPreferences(...)。 (請注意,活動和服務場合,它們間接地延長android.content.Context。)

CommonsWare寫了深入的答案:When to call activity context OR application context?,他做的是調用getApplicationContext()"is almost always wrong",並概述了一些例外的時候使用它的情況下:

  • 從活動綁定到服務。
  • 需要將某些東西與全局範圍內的上下文綁定。

CommonsWare還鏈接到answer通過Android框架工程師戴安娜Hackborn:

第一條規則我會給你:如果你不知道你爲什麼需要[應用上下文],你可能不要不需要它(...)唯一需要使用getApplicationContext()的時候是需要一個存在於Activity類(或其他組件)生命週期之外的Context。

上就與ApplicationContext問題進行討論同一主題的更多答案:

10

爲貢納爾·卡爾鬆提到ContextWrapper的getApplicationContext()使用它很清楚,您應該只使用ActivityService語境註冊/註銷您的接收器,綁定/解除綁定的服務(除非是真正需要的靜態數據,而不是特定的組件註冊),以避免不確定的內存泄漏,即使你忘記了是安全的有時要註銷,系統會通過警告爲您清除它。

但是,對於getSharedPreferences(...),您始終可以順利使用任何ApplicationContextContext。該reason是,它已被明確提及

對於任何特定的偏好組(這裏SharedPreferences),還有的 該類所有客戶共享一個實例。

只通過應用程序上下文獲取引用不會永久保留引用。它只是像任何其他應用程序上下文一樣參照偏好。所以一旦用戶完成它就會被清除。

請注意,通過應用程序上下文註冊接收器將被維護爲與您的應用程序相關聯的全局狀態。所以它永遠不會被清除。

如果我錯了,請有人糾正我。

希望這會幫助你。

+2

我想相信這一點,希望它是正確的。 – 2015-04-16 12:19:14

+0

@Toro,請添加您的發現以支持評論。最終,所有用戶都應該知道您爲什麼認爲上述答案是不正確的。 – 2017-08-21 07:10:30

相關問題