PreferenceManager.getDefaultSharedPreferences()vs getPreferences()

asc*_*sco 2 android android-preferences sharedpreferences

PreferenceManager.getDefaultSharedPreferences(context)
Run Code Online (Sandbox Code Playgroud)

getPreferences()
Run Code Online (Sandbox Code Playgroud)

似乎检索不同的首选项.

PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
                        "userWasAskedToEnableGps", false);
Run Code Online (Sandbox Code Playgroud)

对我来说,返回false,

getPreferences(MODE_PRIVATE).getBoolean("userWasAskedToEnableGps", false);
Run Code Online (Sandbox Code Playgroud)

返回true.

Preference是用编辑器编写的

Editor e = getPreferences(MODE_PRIVATE).edit(); 
e.putBoolean (...);
e.commit();
Run Code Online (Sandbox Code Playgroud)

如何在Context中的Activity之外获得相同的Preferences?

Sun*_*hra 13

根据文件

getSharedPreferences()- 如果需要通过名称标识的多个首选项文件(使用第一个参数指定),请使用此选项.

getPreferences()- 如果您只需要一个活动的首选项文件,请使用此选项.因为这将是您的Activity的唯一首选项文件,所以您不提供名称. 范围仅限于创建它的活动

所以,如果你想要的偏好是在其他活动或上下文中可用,你必须使用的两种getSharedPreferences()getDefaultSharedPreferences()

这个ans解释了你们两者之间的区别.


Kir*_*ran 9

从android github repo(1),我们可以看到getPreferences除了getSharedPreferences使用当前类名调用方法之外什么都不做.

public SharedPreferences getPreferences( int mode ) {
    return getSharedPreferences( getLocalClassName(), mode );
}
Run Code Online (Sandbox Code Playgroud)

没有什么限制其他活动/代码使用适当的类名访问共享首选项.更重要的是,我不想使用getPreferences,因为这意味着=>永远不会改变活动名称.如果更改,则使用明确提及的早期类名称(升级前)来处理访问共享首选项.