Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的SharedReferences未跨多个正在运行的进程获取最近更新的值_Android_Multiprocessing_Android Sharedpreferences - Fatal编程技术网

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

Android中的SharedReferences未跨多个正在运行的进程获取最近更新的值,android,multiprocessing,android-sharedpreferences,Android,Multiprocessing,Android Sharedpreferences,说明: 我有两个应用程序App1和App2。我正在使用App1在SharedReferences中存储一些键值对。我正在App2中访问相同的键值 我启动app1。创建一个值为abc的键。现在,我将app1保留在后台并启动App2,然后将键值更改为def 当我从后台到前台启动app1并访问键值时。检索到的值是abc,而不是更新的值def。如果我从后台杀死App2并重新启动它,那么只有更新的值才会得到反映SharedReferences从未支持多个进程,更不用说多个应用了。明确指出: 注意:此类不支

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

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


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

SharedReferences
从未支持多个进程,更不用说多个应用了。明确指出:

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


由于SharedReferences无法识别跨多个进程的数据更改,因此不会更新该值。

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


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

当进程从共享首选项读取数据时,它会复制值(数据),并将这些数据放在其进程的缓存中。这样做是因为从磁盘读取/写入的速度太慢。通常,系统会为Android组件创建缓存进程。现在,来自SharedReferences的数据存储在组件的缓存进程中。缓存进程有自己的内存空间。在组件使用内存之前,它会锁定(关键部分),以防止其他组件无法访问该内存。应该终止缓存进程,以便其他进程(或组件)现在可以访问它。这就是为什么重新启动时会看到更新

临界截面:

不同的流程:

在线程级别,您使用关键字
volatile
,以便查看来自第二个线程的一个线程更新数据。但是SharedReferences不能是易变的,因为它是持久存储


这就是为什么他们明确声明共享数据引用不支持多个进程的原因

根据他们的文档,共享数据引用不是进程安全的。我遇到了类似的问题。我在一个活动中使用SharedReferences中的值,然后在另一个进程的服务中使用。同一个值的行为类似于两个不同的值


我用这个来解决这个问题。它基本上是相同的方法、语法和过程安全的

SharedReferences
从未支持多个进程,更不用说多个应用了。文件明确规定:

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


在我的案例中,
SharedReferences
必须替换为内容提供商

如果这两个应用在Manifest1中都具有相同的共享用户id,则可以访问该应用,但如果在app1中将minsdk设置为8,则不会出现此问题。它仅在min sdk大于8时发生。这个问题与min有什么关系sdk@Shivanisrivastava:
minSdkVersion
对运行时没有影响。它只是控制你的应用程序可以安装在哪里。上面的链接提到了类似的问题issue@Shivanisrivastava:
minSdkVersion
未在该页面上提及,您可以通过搜索该页面中的
minSdkVersion
来判断。但如果在app1的清单中将min sdk设置为8,则不会出现此问题。您确定吗?共享首选项来自API级别1,文档中也没有提到。是的,没有与此相关的文档。但我面临着这个问题。不确定SharedReference与min sdk的关系。如果我在多模式进程中获得SharedReferences,它可以正常工作。但是我想使用mode\u private您是否尝试使用
mode\u WORLD\u WRITEABLE
调用
getSharedReferences()
?或者
MODE\u MULTI\u PROCESS
(在API 23中已弃用)?是的,我尝试了这个。如果模式为多进程模式,则此功能有效。但我的要求是使用mode_PRIVATE with
mode_PRIVATE
只有具有相同用户ID的应用程序才能访问共享首选项。看看这里:是的,这两个应用在清单中有相同的共享用户id。你是用
apply
还是
commit
保存数据?我还不知道。我认为这是不可能的。因为当进程进入关键部分时,它会锁定其内存空间。在它被杀死后,它将数据刷新到SharedReferences。现在,另一个进程可以获得更新的值。我也在研究它,如果我知道会让你知道。。。