【问题标题】:Difference between getDefaultSharedPreferences and getSharedPreferencesgetDefaultSharedPreferences 和 getSharedPreferences 之间的区别
【发布时间】:2011-08-22 05:08:16
【问题描述】:

Android 中的getDefaultSharedPreferencesgetSharedPreferences 有什么区别?谁能解释一下?

【问题讨论】:

  • 一个几乎太明显的区别是一个是静态的,一个不是。但这并不重要,因为您需要一个 Context 实例才能调用其中任何一个。

标签: android android-preferences sharedpreferences


【解决方案1】:

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 不公开,因为备份/恢复框架需要名称。
  • 在使用自定义名称作为偏好的 getSharedPreferences 模式下,如何监听偏好变化? (不使用默认名称,如 getSharedPreferences "com.example.something_preferences")
  • 能否请您添加指向源的链接?
  • @Mr_and_Mrs_D 查找起来更容易。如果我添加一个链接,它将指向特定的 API 版本,这可能是也可能不是您要查找的内容。
【解决方案2】:

让我们回顾一下基本的区别点:

  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) 需要指明特定的首选项(文件)名称和操作模式(例如私有、世界可读等)

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

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

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

【讨论】:

  • 在使用自定义名称作为偏好的 getSharedPreferences 模式下,如何监听偏好变化? (不使用默认名称,如 getSharedPreferences "com.example.something_preferences")
  • Dr.jacky 我想说你会把你的偏好包装在某种类似 Session 的对象中:class Session { prefs = getSharedPreferences() ... } 然后使用 getter 和 setter你想监控的东西。当 setter 被调用时,您可以在 setter 逻辑中触发事件。
【解决方案3】:

我知道这篇文章有点老了,但是从 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)
  • 看起来 PreferenceManager 正在被弃用,因为它只是被移动到 Androix。 developer.android.com/reference/androidx/preference/…
【解决方案4】:

还有第三个功能:

public SharedPreferences Activity.getPreferences(int mode) {}

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

【讨论】:

  • 这是来自 Activity 源代码的 getSharedPreferences() 的包装器: public SharedPreferences getPreferences(int mode) { return getSharedPreferences(getLocalClassName(), mode); }
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
    

    => 共享偏好的名称:“com.my.packagename

    PreferenceManager.getDefaultSharedPreferences(context);
    

    => 共享偏好的名称:“com.my.packagename_preferences

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 2016-01-31
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      • 2012-08-12
      相关资源
      最近更新 更多