Android中的getDefaultSharedPreferences
和getSharedPreferences
有什么区别?有人可以解释一下吗?
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;
}
让我们回顾一下差异的基本点:
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_readable等)正如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) {}
在这里查看我的问题和答案:Mess with the shared preferences of android - which function to use?
getSharedPreferences()和getDefaultSharedPreferences()都用于访问应用程序级首选项.getDefaultSharedPreferences()用于获取符合Android整体首选框架的共享首选项。最好使用getDefaultSharedPreferences(),因为它提供了默认情况下与PreferenceActivity一起使用的SharedPreferences对象。
请注意,使用默认共享首选项与使用包名称的共享首选项不同:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=>共享首选项的名称:“com.my.packagename”
PreferenceManager.getDefaultSharedPreferences(context);
=>共享首选项的名称:“com.my.packagename_preferences”