Answers:
getDefaultSharedPreferences
将使用默认的名称,比如“com.example.something_preferences”,但getSharedPreferences
将需要一个名字。
getDefaultSharedPreferences
实际上使用Context.getSharedPreferences
(下面直接来自Android来源):
public static SharedPreferences getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
}
private static String getDefaultSharedPreferencesName(Context context) {
return context.getPackageName() + "_preferences";
}
private static int getDefaultSharedPreferencesMode() {
return Context.MODE_PRIVATE;
}
getDefaultSharedPreferencesName
是不公开的,因为备份/还原框架需要名称。
让我们回顾一下差异的基本点:
getDefaultSharedPreferences()
使用默认的首选项文件名。该默认值是针对每个应用程序设置的,因此,在同一应用程序上下文中的所有活动都可以轻松访问它,如以下示例所示:
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
。
替代方法- getSharedPreferences(name,mode)
要求指示特定的首选项(文件)名称和操作模式(例如,private,world_read等)
正如copolii所提到的,结果是相同的,但是第一个选项更简单,并且缺乏拆分为多个首选项文件的灵活性,这由的第二个选项提供getSharedPreferences()
。使用MODE_WORLD_READABLE操作指示器在应用之间共享首选项也是可以使用的getSharedPreferences()
,但很少使用。
恕我直言,getDefaultSharedPreferences()
可以安全地使用它,而不会引起容易出现拼写错误和混乱的多个首选项文件名的混乱,除非您希望应用中的不同模块将使用不同的首选项文件。通常不需要。如果应用程序需要保存很多参数,则使用外部数据库可能会更好,因为它还提供了更好的数据保护。
如果有人知道有规律地定期使用getSharedPreferences()而不是getDefaultSharedPreferences()的充分理由,请在此处评论以告知我。
我知道这篇文章有点老了,但是由于v7支持库的24.0.1版本,您可以在任何地方使用上下文来检索默认首选项
// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)
还有第三个功能:
public SharedPreferences Activity.getPreferences(int mode) {}
看到我的问题和答案在这里:混乱与android的共享的首选项-使用哪个功能?
getSharedPreferences()和getDefaultSharedPreferences()均用于访问应用程序级别的首选项。getDefaultSharedPreferences()用于获取符合Android整体首选项框架的共享首选项。getDefaultSharedPreferences()最好使用,因为它提供了默认情况下与PreferenceActivity一起使用的SharedPreferences对象。
Context
实例来调用任一实例。