Android中的SharedPreferences未在多个正在运行的进程中获取最近更新的值

时间:2017-10-10 16:10:32

标签: android multiprocessing android-sharedpreferences

描述: 我有两个应用程序App1和App2。我正在使用App1在SharedPreferences中存储一些键值对。我在App2中访问相同的键值。

我启动了app1。创建值为abc的密钥。现在我将app1保留在后台并启动App2,然后将键值更改为def。

当我从后台启动app1到前台并访问键值时。检索到的值是abc而不是更新的值def。如果我从后台杀死App2并重新启动它,那么只有更新的值才会被反映

6 个答案:

答案 0 :(得分:7)

SharedPreferences从未支持多个流程,更不用说多个应用。 The documentation明确指出:

  

注意:此类不支持跨多个进程使用。

答案 1 :(得分:0)

由于SharedPreferences无法识别多个流程中的数据更改,因此值不会更新。

答案 2 :(得分:0)

应用的共享偏好设置存储在应用内部存储空间内的其他应用无法访问的单独文件中。两个不同应用程序的共享首选项位于两个不同的位置,并且彼此独立。

因此,任何其他应用都无法访问应用的共享偏好设置,并且应用的共享偏好设置中的更改不会反映在任何其他应用中。

答案 3 :(得分:0)

当进程从SharedPreferences读取数据时,它会复制值(数据)并将这些数据放入缓存中的进程内。它这样做是因为从磁盘读取/写入太慢。通常,System会为Android组件创建缓存过程。现在,来自SharedPreferences的数据存储在组件的缓存进程中。缓存进程拥有自己的内存空间。在组件使用内存之前,它会锁定(临界区)以防止其他组件无法访问该内存。应该终止缓存进程,以便其他进程(或组件)现在可以访问它。这就是为什么当你重新启动时,你会看到更新。

关键部分: https://en.wikipedia.org/wiki/Critical_section

不同的流程: https://developer.android.com/guide/components/activities/process-lifecycle.html

在线程级别,您使用关键字volatile,以便从第二个线程中看到一个线程更新的数据。但SharedPreferences不能是volatile,因为它是持久存储。

这就是为什么他们明确声明 SharedPreferences不支持多个流程

答案 4 :(得分:0)

根据其文档,共享偏好不是过程安全的。我遇到了类似的问题。我使用的是活动中的共享偏好值,然后是另一个进程的服务中的值。相同的值表现得像两个不同的值。

我使用此lib来解决此问题。它的方法和语法基本相同,并且过程安全。

答案 5 :(得分:0)

SharedPreferences从不支持多个进程,更不用说多个应用程序了。该文档明确指出:

注意:此类不支持跨多个进程使用。

在我的情况下,必须用内容提供商替换

SharedPreferences