13

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

Udacity 课程的解决方案说,要获取 的SharedPreferences实例PreferenceActivity,您应该调用:

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

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

虽然Android Developer Site 上的官方文档表明您应该调用:

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

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

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

提前致谢。

4

4 回答 4

21

根据您提供给 Android 文档的链接

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

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

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

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

于 2015-10-31T02:10:20.083 回答
15

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

于 2016-07-05T22:12:21.597 回答
9

如果您查看 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();

于 2016-11-02T07:46:06.720 回答
1

来自下面链接的第一篇文章:“注意: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

于 2015-10-31T02:09:56.687 回答