在getDefaultSharedPreferences上传递的上下文会影响结果吗?

时间:2018-12-11 15:45:33

标签: android sharedpreferences android-preferences

我遇到一个奇怪的错误,所以我试图消除这种可能性。

传递给PreferenceManager.getDefaultSharedPreferences()的上下文会改变结果吗?

我的意思是,当我在为我的应用程序编写设置时,我从不关注传递给此方法的上下文,因为它是有效的上下文...

有时我会把Activity,有时是Appliaction放在我手边的任何背景

错了吗?我注意到我在某些时候得到了错误的首选项值,而且我不知道我的代码中是否存在错误或是否存在

2 个答案:

答案 0 :(得分:2)

是否提供ApplicationActivity作为Context的{​​{1}}参数都没关系。

如果您查看PreferenceManager.getDefaultSharedPreferences()的来源:

getDefaultSharedPreferences()

再来看return context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode());

getDefaultSharedPreferencesName(context)

这意味着对于您的任何return context.getPackageName() + "_preferences"; 应用程序,您都会得到相同的Context,因为您的应用程序ID不会根据SharedPreferencesActivity进行更改。

唯一可能会遇到潜在问题的情况是,您是否正在为另一个软件包手动创建Application(例如,使用Context)。

答案 1 :(得分:0)

SharedPreferences数据存储区都有一个名称,只要您使用相同的名称,您将始终获得相同的数据存储区。

@kcoppock的提示,他指出在PreferenceManager.getDefaultSharedPreferences()的特殊情况下,生成的名称唯一依赖的是上下文的包。由于您传递的任何ApplicationActivity实例极有可能具有相同的包名称,因此在您的情况下,您应始终获得相同的数据存储。

不过,还有其他方法可以检索SharedPreferences个存储。 Activity.getPreferences()将根据活动的类名称生成名称,因此从两个不同活动中调用getPreferences()将为您提供两个不同的数据存储。

您还可以直接调用Context.getSharedPreferences()(PreferenceManager和Activity都直接调用此方法)并显式传递数据存储名称。对该名称的外观没有要求;只要使用相同的名称,您将始终获得相同的数据存储。

https://developer.android.com/reference/android/content/Context#getSharedPreferences(java.lang.String,%20int)