我遇到一个奇怪的错误,所以我试图消除这种可能性。
传递给PreferenceManager.getDefaultSharedPreferences()
的上下文会改变结果吗?
我的意思是,当我在为我的应用程序编写设置时,我从不关注传递给此方法的上下文,因为它是有效的上下文...
有时我会把Activity
,有时是Appliaction
放在我手边的任何背景
错了吗?我注意到我在某些时候得到了错误的首选项值,而且我不知道我的代码中是否存在错误或是否存在
答案 0 :(得分:2)
是否提供Application
或Activity
作为Context
的{{1}}参数都没关系。
如果您查看PreferenceManager.getDefaultSharedPreferences()
的来源:
getDefaultSharedPreferences()
再来看return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
:
getDefaultSharedPreferencesName(context)
这意味着对于您的任何return context.getPackageName() + "_preferences";
应用程序,您都会得到相同的Context
,因为您的应用程序ID不会根据SharedPreferences
或Activity
进行更改。
唯一可能会遇到潜在问题的情况是,您是否正在为另一个软件包手动创建Application
(例如,使用Context
)。
答案 1 :(得分:0)
SharedPreferences
数据存储区都有一个名称,只要您使用相同的名称,您将始终获得相同的数据存储区。
@kcoppock的提示,他指出在PreferenceManager.getDefaultSharedPreferences()
的特殊情况下,生成的名称唯一依赖的是上下文的包。由于您传递的任何Application
或Activity
实例极有可能具有相同的包名称,因此在您的情况下,您应始终获得相同的数据存储。
不过,还有其他方法可以检索SharedPreferences
个存储。 Activity.getPreferences()
将根据活动的类名称生成名称,因此从两个不同活动中调用getPreferences()
将为您提供两个不同的数据存储。
您还可以直接调用Context.getSharedPreferences()
(PreferenceManager和Activity都直接调用此方法)并显式传递数据存储名称。对该名称的外观没有要求;只要使用相同的名称,您将始终获得相同的数据存储。