Android 同一应用程序的两个进程之间的共享首选项

Android 同一应用程序的两个进程之间的共享首选项,android,sharedpreferences,android-service,Android,Sharedpreferences,Android Service,我正在编写一个Android应用程序,它包含UI和运行的独立进程。 我希望在主进程和在不同进程中执行的应用程序中定义的服务之间共享简单信息。 为此,我发现使用AIDL进行进程间通信很麻烦 问题是:使用应用程序的共享首选项在这两个进程之间进行通信是否安全?这就是:读取和写入相同的共享首选项 我想知道它是否真的有效。在android中,开发人员参考共享首选项(http://developer.android.com/reference/android/content/SharedPreference

我正在编写一个Android应用程序,它包含UI和运行的独立进程。 我希望在主进程和在不同进程中执行的应用程序中定义的服务之间共享简单信息。 为此,我发现使用AIDL进行进程间通信很麻烦

问题是:使用应用程序的共享首选项在这两个进程之间进行通信是否安全?这就是:读取和写入相同的共享首选项

我想知道它是否真的有效。在android中,开发人员参考共享首选项(http://developer.android.com/reference/android/content/SharedPreferences.html)它们声明:注意:当前此类不支持跨多个进程使用。这将在以后添加。但我不知道这到底意味着什么


感谢您的帮助

在安卓<2.3中,它工作正常。一个进程可以写入更改,另一个进程可以读取更改。读取/写入共享首选项文件(它们实际上存储在文件中)的代码检查在读取/写入之前是否对文件进行了任何更改,并相应地更新其缓存版本

在Android>2.3中,它可以工作,但在调用
getSharedReferences()
时,需要专门设置
MODE\u MULTI\u PROCESS

在Android 2.3中,它已损坏且无法工作:-(


请注意,
MODE\u MULTI\u PROCESS
在中被弃用。

否;这样做不安全。您引用的说明是正确的。如果您尝试跨多个进程使用
SharedReference
,可能会出现已知问题。(请参阅。)

如果您想要更多的证据,请查看
SharedReferencesImpl
的源代码,特别是保存首选项的部分

我通过阻止两个进程同时访问
SharedReferences
文件来解决这个问题


警告:不幸的是,
模式多进程
在Android M中已被弃用,因此在以后的版本中可能会停止工作。另一种技术,如使用
内容提供者
可能是更好的选择。

您可以查看提供共享引用(如访问共享资源的API)的库通过ContentProvider引用数据。在Google从Android 6中删除MODE_MULTI_进程之后,它看起来也是一个不错的替代方案。

“我正在编写一个Android应用程序,它包含UI和运行的单独进程”--为什么?应用程序旨在定期检查用户信息并通过web服务发送。我有一个UI,允许用户定义一些配置并停止或启动服务。我不想强制保持应用程序UI进程运行(只是后台服务)实际上我是这样做的。但是如果你以远程方式运行服务(在不同的进程中运行后台服务),那么数据就无法共享。在这种情况下,它们都使用不同的“应用程序”。我可能错了吗?步骤1:将其重构为一个带有单个进程的单个应用程序。步骤2:使用
AlarmManager
来处理“周期性”部分。您当前的方法(两个进程,一个显然永远运行)对用户不友好。@Javierfdr:您确实知道
活动(您的UI组件)和
服务(默认情况下)不友好在不同的进程中运行?我已经用不同的2.3.X子版本在多个设备上进行了测试,并且在每种情况下都取得了明显的成功。在发布代码之前,我是否应该知道2.3中有什么问题?@DarshanComputing我们在2.3上遇到了以下可重复的问题:进程A更新(写入)首选项。然后进程B读取首选项,但它获取旧的(未更新)值。这可能是特定供应商在某些错误修复版本中修复的(我们使用HTC Desire S进行测试)。这是有关@DavidWasser的更多信息的链接:android解决了这个问题吗?。我没有2.3手机来测试这个,无论如何我必须验证这些手机,因为我的应用程序是多进程的。自SDK v23(android M)以来,android团队将删除模式多进程。我建议你使用我在回答中提到的库。