【问题标题】:What's the difference between getDefaultSharedPreferences() and getPreferences()?getDefaultSharedPreferences() 和 getPreferences() 有什么区别?
【发布时间】:2016-01-31 13:06:27
【问题描述】:

我目前正在学习“开发 Android 应用程序”Udacity 课程。在“第 3 课:新活动和意图 > 使用 SharedPreferences”部分中,讲师让我在 Android 开发者网站上挖掘如何从 SharedPreferences 获取用户首选项。但是,我发现官方文档和课程解决方案之间存在差异。

Udacity 课程的solution 说,要为PreferenceActivity 获取SharedPreferences 实例,您应该调用:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

(这里的getActivity() 就是Context,因为它在Fragment 中被调用。)

虽然 Android 开发者网站上的 the official documentation 表明您应该调用:

SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE)

那么PreferenceManager.getDefaultSharedPreferences(Context context)Activity.getPreferences(int mode) 有什么区别呢?

请注意:这个问题不涉及任何关于getSharedPreferences() 的内容,它需要文件名。这是关于getPreferences()getDefaultSharedPreferences() 之间的区别。

提前致谢。

【问题讨论】:

    标签: android android-preferences android-sharedpreferences


    【解决方案1】:

    如果您查看 PreferenceManager 内部:

    public static SharedPreferences getDefaultSharedPreferences(Context context) {
        return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
                getDefaultSharedPreferencesMode());
    }
    
    /**
     * Returns the name used for storing default shared preferences.
     *
     * @see #getDefaultSharedPreferences(Context)
     * @see Context#getSharedPreferencesPath(String)
     */
    public static String getDefaultSharedPreferencesName(Context context) {
        return context.getPackageName() + "_preferences";
    }
    
    private static int getDefaultSharedPreferencesMode() {
        return Context.MODE_PRIVATE;
    }
    

    所以 getDefaultSharedPreferences() 使用 getSharedPreferences() 方法和您的应用程序包名称和模式私有,如果您从活动中使用 getPreferences() 它将使用相同的 getSharedPreferences() 方法但使用 getLocalClassName();

    【讨论】:

      【解决方案2】:

      主要区别之一:getPreferences() 返回一个仅与打开它的活动相关的文件。而getDefaultSharedPreferences() 返回应用程序的全局首选项。昨天很难学到这一点。

      【讨论】:

      【解决方案3】:

      根据您提供的 Android 文档链接

      getSharedPreferences() - 如果您需要多个按名称标识的首选项文件,请使用此选项,您可以使用第一个参数指定该名称。

      getPreferences() - 如果您的 Activity 只需要一个首选项文件,请使用此选项。因为这将是您的 Activity 的唯一首选项文件,所以您无需提供名称。

      因此,当您要保存/检索的数据可以从应用程序中的不同活动中使用时,请使用 getSharedPreferences。如果这些首选项只会在一个 Activity 中使用,您可以使用 getPreferences。

      编辑:还请注意,正如您链接的帖子中所说,“getDefaultSharedPreferences 将使用默认名称,如“com.example.something_preferences”,但 getSharedPreferences 将需要名称'

      【讨论】:

      • 问题没有解决 getsharedprefereces... 这是关于 getdefaultsharedpreference 和 getpreferences 之间的区别... 另请注意,如果使用 getshared 首选项或 getpreferences 存储首选项键/值,它将不可用作为另一项活动的默认偏好...您知道就像问题询问您未解决的事情之间的差异...
      【解决方案4】:

      来自以下链接的第一篇文章:“注意:SharedPreferences API 仅用于读取和写入键值对,您不应将它们与 Preference API 混淆,后者可帮助您为应用构建用户界面设置(尽管他们使用 SharedPreferences 作为实现来保存应用设置)。"

      http://developer.android.com/training/basics/data-storage/shared-preferences.html

      http://developer.android.com/guide/topics/ui/settings.html

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        • 2015-03-26
        相关资源
        最近更新 更多