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

SharedPreferences in Android not getting recently updated values across multiple running processes

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

我启动 app1。创建一个值为 abc 的键。现在,我将 app1 保留在后台并启动 App2,并将键值更改为 def.

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

SharedPreferences一直不支持多进程,更不用说多app了。 The documentation 明确指出:

Note: This class does not support use across multiple processes.

该值未更新,因为 SharedPreferences 无法识别跨多个进程的数据更改。

应用程序的共享首选项存储在应用程序内部存储中的一个单独文件中,其他应用程序无法访问。两个不同应用的共享首选项位于两个不同的位置,并且相互独立。

因此任何其他应用都无法访问一个应用的共享首选项,并且一个应用的共享首选项的更改不会反映在任何其他应用中。

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

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

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

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

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

根据其文档,共享首选项不是进程安全的。我运行陷入了类似的问题。我在 activity 中使用来自 sharedpreferences 的值,然后在另一个进程的服务中使用。相同的值表现得像两个不同的值。

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

SharedPreferences一直不支持多进程,更不用说多app了。文档明确指出:

Note: This class does not support use across multiple processes.

在我的案例中,

SharedPreferences 必须替换为内容提供者。