getDefaultSharedPreferences和getSharedPreferences之间的区别

问题描述 投票:212回答:6

Android中的getDefaultSharedPreferencesgetSharedPreferences有什么区别?有人可以解释一下吗?

android android-preferences sharedpreferences
6个回答
222
投票

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;
}

118
投票

让我们回顾一下差异的基本点:

  1. 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
  2. 替代方法 - getSharedPreferences(name,mode)需要指明特定的首选项(文件)名称和操作模式(例如private,world_readable等)

正如copolii所提到的,结果是相同的,但第一个选项更简单,并且缺乏分割到多个首选项文件的灵活性,这是由getSharedPreferences()的第二个选项提供的。使用MODE_WORLD_READABLE操作指示器在应用程序之间共享首选项也可以使用getSharedPreferences(),但很少使用。

恕我直言,getDefaultSharedPreferences()可以安全使用,而不会混淆多个偏好文件名,容易出现拼写错误和混淆,除非您希望您的应用程序中的不同模块将使用不同的首选项文件。通常这不是必需的。如果一个应用程序需要保存很多参数,可能使用外部数据库会更好,因为它提供了更好的数据保护。

如果有人知道经常使用getSharedPreferences()而不是getDefaultSharedPreferences()的充分理由,请通过此处的评论告诉我。


2
投票

我知道这篇文章有点旧,但是从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)

https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences


1
投票

还有第三个功能:

public SharedPreferences Activity.getPreferences(int mode) {}

在这里查看我的问题和答案:Mess with the shared preferences of android - which function to use?


1
投票

getSharedPreferences()和getDefaultSharedPreferences()都用于访问应用程序级首选项.getDefaultSharedPreferences()用于获取符合Android整体首选框架的共享首选项。最好使用getDefaultSharedPreferences(),因为它提供了默认情况下与PreferenceActivity一起使用的SharedPreferences对象。


0
投票

请注意,使用默认共享首选项与使用包名称的共享首选项不同:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=>共享首选项的名称:“com.my.packagename”

PreferenceManager.getDefaultSharedPreferences(context);

=>共享首选项的名称:“com.my.packagename_preferences”

© www.soinside.com 2019 - 2024. All rights reserved.