getDefaultSharedPreferences和getSharedPreferences之间的区别


224

getDefaultSharedPreferencesgetSharedPreferencesAndroid 之间有什么区别?谁能解释一下?


几乎太明显的区别是,一个是静态的,一个不是静态的。但这并不重要,因为您需要一个Context实例来调用任一实例。
LarsH '16

Answers:


224

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

9
不好的getDefaultSharedPreferencesName是不公开的,因为备份/还原框架需要名称。
马丁


以及如何在使用自定义名称作为首选项的getSharedPreferences模式下侦听首选项更改?(不使用默认名称,如getSharedPreferences“ com.example.something_preferences”)
Dr.jacky 2012年

您能添加一个链接到源吗?
Mr_and_Mrs_D 2013年

@Mr_and_Mrs_D可以更轻松地查找它。如果我添加一个链接,它将指向特定的API版本,这可能是您想要的,也可能不是。
copolii

120

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

  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_read等)

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

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

如果有人知道有规律地定期使用getSharedPreferences()而不是getDefaultSharedPreferences()的充分理由,请在此处评论以告知我。



1
以及如何在使用自定义名称作为首选项的getSharedPreferences模式下侦听首选项更改?(不使用默认名称,例如getSharedPreferences“ com.example.something_preferences”)
Dr.jacky 2012年

Dr.jacky我想说的是,您会将自己的首选项包装在某种类似于Session的对象中:Session类{prefs = getSharedPreferences()...},然后对要监视的事物使用getter和setter。调用设置器时,可以在设置器逻辑中触发事件。
Alex Weavers

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


PreferenceManager在Android Q中已被弃用。尽管如此,您仍然可以使用context.getSharedPreferences方法。将此调用更改为context.getSharedPreferences(“ $ {packageName} _preferences”,MODE_PRIVATE)
凯文,

2
似乎不建议使用PreferenceManager,因为它只是被移至Androix。developer.android.com/reference/androidx/preference/…–
FutureShocked

1

还有第三个功能:

public SharedPreferences Activity.getPreferences(int mode) {}

看到我的问题和答案在这里:混乱与android的共享的首选项-使用哪个功能?


这是来自Activity源代码的getSharedPreferences()的包装:public SharedPreferences getPreferences(int mode){return getSharedPreferences(getLocalClassName(),mode); }
塔恩

1

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


0

请注意,使用默认共享偏好是一样的使用与您的包名共享偏好:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

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

PreferenceManager.getDefaultSharedPreferences(context);

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.