getDefaultSharedPreferences和getSharedPreferences之间的区别

时间:2011-05-10 06:37:15

标签: android android-preferences sharedpreferences

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

6 个答案:

答案 0 :(得分:221)

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

答案 1 :(得分: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等)

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

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

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

答案 2 :(得分:1)

还有第三个功能:

public SharedPreferences Activity.getPreferences(int mode) {}

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我知道这篇文章有点老了,但是由于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

答案 5 :(得分:0)

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

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

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

PreferenceManager.getDefaultSharedPreferences(context);

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