2012-02-21 47 views
21

我只是好奇。有3種方法:當使用getDefaultSharedPreferences和getSharedPreferences

1. getPreferenceManager().setSharedPreferencesName(String PrefName); 

2. PreferenceManager.getDefaultSharedPreferences(Context context) 

3. Context.getSharedPreferences (String name, int mode) 

據我所知,第三種方法僅在使用第一種方法時使用,對嗎? 但用3種方法我們也用addPreferencesFromResource(int resID); 那麼,有什麼區別?我們什麼時候可以使用這些方法之一? 謝謝!

回答

23

讓我們一步步時間:

  1. setSharedPreferencesName()是方法,允許設置供以後使用偏好組的名稱。例如,在通過調用addPreferencesFromResource()加載XML資源文件中的首選項之前,使用幫助器類 PreferencesActivity有幫助。因此它不像上面提到的其他兩種方法那麼普遍。

  2. getDefaultSharedPreferences()使用默認名稱,通常存儲爲/data/data/com.package.name/shared_prefs/com.package.name_preferences.xml。 它是常用的。請注意,此默認值設置爲,每個應用程序

    替代方法 - getSharedPreferences()需要指示特定的首選項(文件)名稱和操作模式。

  3. 也如another answer about shared preferences出現, getDefaultSharedPreferences()其實使用Context.getSharedPreferences,所以結果是一樣的,但沒有flexbility拆分到多個預置文件,由getSharedPreferences()提供。使用 a MODE_WORLD_READABLE操作指示器共享應用程序之間的偏好也可能使用getSharedPreferences(),但很少使用。

IMHO,getDefaultSharedPreferences()可以安全地使用而無需進入是容易拼寫錯誤和混亂多個偏好文件名的混亂。

如果有人知道的一個很好的理由使用getSharedPreferences()而不是getDefaultSharedPreferences(),請讓我通過評論知道這裏。

+1

的主要區別是(getDefaultSharedPreferences VS getSharedPreferences) - 如果你想改變任何getDefaultSharedPreferences中的首選項值,然後使用apply()而不是commit(),如果你在getDefaultSharedPreferences中使用commit,它永遠不會應用任何效果....我已經花費了2小時以上..對於這個愚蠢的錯誤,所以我只是在這裏提到。 – 2016-07-19 12:37:53

1

getDefaultSharedPreferences()使用默認首選項文件名,如"com.example.something_preferences"。此默認每個應用程序設置,所以在相同的應用程序環境中的所有活動,可以很容易地訪問它,如下面的例子:

SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this); 
if (spref.contains("email")) { 
    String sEmailAddr = spref.getString("email", ""); 
} 

偏好通常存儲在/data/data/com.package.name/shared_prefs /com.package.name_preferences。XML

getSharedPreference是最好的方法,因爲使用getDefaultSharedPreferences有一些缺陷

  1. Actualy getDefaultSharedPreferences當構建與targer API 13
  2. 從快捷方式,從開始的應用程序無法正常工作的一些 設備正確菜單給我不同的 DefaultSharedPreferences。從我的代碼中刪除DefaultSharedPreferences 後 - 它完美無缺。我不能只是說:人不要讓 shrotcuts,所以我不得不改變代碼

link還可以幫助

相關問題