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

does the context passed on getDefaultSharedPreferences affects the result?

我遇到了一个奇怪的错误,所以我正在尝试排除可能性。

传递给 PreferenceManager.getDefaultSharedPreferences() 的上下文是否改变了结果?

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

有时我会把 Activity,有时 Appliaction 我手头上的任何上下文

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

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

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

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

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

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

提供 ApplicationActivity 作为 PreferenceManager.getDefaultSharedPreferences()Context 参数并不重要。

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

return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());

进一步观察 getDefaultSharedPreferencesName(context):

return context.getPackageName() + "_preferences";

这意味着对于您的任何 Context 应用程序,您将得到相同的 SharedPreferences 返回,因为您的应用程序 ID 不会根据 ActivityApplication.

您唯一可能 运行 遇到潜在问题的情况是您手动为另一个包创建 Context(例如使用 Context.createPackageContext())。