传递给 getDefaultSharedPreferences 的上下文会影响结果吗?
does the context passed on getDefaultSharedPreferences affects the result?
我遇到了一个奇怪的错误,所以我正在尝试排除可能性。
传递给 PreferenceManager.getDefaultSharedPreferences()
的上下文是否改变了结果?
我的意思是,当我将设置写入我的应用程序时,我从不注意将哪个上下文传递给此方法,因为它是一个有效的上下文...
有时我会把 Activity
,有时 Appliaction
我手头上的任何上下文
有错吗?我注意到我在某些时候得到了错误的首选项值,我不知道我的代码中是否存在错误或者这是
SharedPreferences
数据存储都有一个 名称,只要您使用相同的名称,您将始终获得相同的数据存储。
向@kcoppock 致敬,他指出在 PreferenceManager.getDefaultSharedPreferences()
的特殊情况下,生成的名称唯一依赖的是上下文包。由于您传递的任何 Application
或 Activity
实例极有可能具有相同的包名称,因此在您的情况下,您应该始终获得相同的数据存储。
不过,还有其他方法可以检索 SharedPreferences
商店。 Activity.getPreferences()
将根据 Activity 的 class 名称生成名称,因此从两个不同的活动中调用 getPreferences()
将为您提供两个不同的数据存储。
您也可以直接调用 Context.getSharedPreferences()
(PreferenceManager 和 Activity 都只是调用它)并显式传递数据存储名称。名称的外观没有要求;只要您使用相同的名称,您将始终获得相同的数据存储。
提供 Application
或 Activity
作为 PreferenceManager.getDefaultSharedPreferences()
的 Context
参数并不重要。
如果您查看 getDefaultSharedPreferences()
的来源:
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
进一步观察 getDefaultSharedPreferencesName(context)
:
return context.getPackageName() + "_preferences";
这意味着对于您的任何 Context
应用程序,您将得到相同的 SharedPreferences
返回,因为您的应用程序 ID 不会根据 Activity
或 Application
.
您唯一可能 运行 遇到潜在问题的情况是您手动为另一个包创建 Context
(例如使用 Context.createPackageContext()
)。
我遇到了一个奇怪的错误,所以我正在尝试排除可能性。
传递给 PreferenceManager.getDefaultSharedPreferences()
的上下文是否改变了结果?
我的意思是,当我将设置写入我的应用程序时,我从不注意将哪个上下文传递给此方法,因为它是一个有效的上下文...
有时我会把 Activity
,有时 Appliaction
我手头上的任何上下文
有错吗?我注意到我在某些时候得到了错误的首选项值,我不知道我的代码中是否存在错误或者这是
SharedPreferences
数据存储都有一个 名称,只要您使用相同的名称,您将始终获得相同的数据存储。
向@kcoppock 致敬,他指出在 PreferenceManager.getDefaultSharedPreferences()
的特殊情况下,生成的名称唯一依赖的是上下文包。由于您传递的任何 Application
或 Activity
实例极有可能具有相同的包名称,因此在您的情况下,您应该始终获得相同的数据存储。
不过,还有其他方法可以检索 SharedPreferences
商店。 Activity.getPreferences()
将根据 Activity 的 class 名称生成名称,因此从两个不同的活动中调用 getPreferences()
将为您提供两个不同的数据存储。
您也可以直接调用 Context.getSharedPreferences()
(PreferenceManager 和 Activity 都只是调用它)并显式传递数据存储名称。名称的外观没有要求;只要您使用相同的名称,您将始终获得相同的数据存储。
提供 Application
或 Activity
作为 PreferenceManager.getDefaultSharedPreferences()
的 Context
参数并不重要。
如果您查看 getDefaultSharedPreferences()
的来源:
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
进一步观察 getDefaultSharedPreferencesName(context)
:
return context.getPackageName() + "_preferences";
这意味着对于您的任何 Context
应用程序,您将得到相同的 SharedPreferences
返回,因为您的应用程序 ID 不会根据 Activity
或 Application
.
您唯一可能 运行 遇到潜在问题的情况是您手动为另一个包创建 Context
(例如使用 Context.createPackageContext()
)。