我正在编写一个Android应用程序,其中包含UI和运行的单独进程。 我想在主进程和我的应用程序中定义的服务之间共享简单信息,该服务在不同的进程中执行。 为此,我发现使用AIDL进行进程间通信会很麻烦。
问题是:使用应用程序的共享首选项在这两个进程之间进行通信是否安全?这是:读取和写入相同的共享首选项。
我想知道它是否真的有效。在android开发人员中有关共享首选项的参考(http://developer.android.com/reference/android/content/SharedPreferences.html),他们声明:注意:目前这个类不支持跨多个进程使用。这将在稍后添加。但我不确切地知道这是什么意思。
感谢您的帮助
答案 0 :(得分:33)
在Android< 2.3它的工作原理。一个进程可以写入更改,另一个进程可以读取更改。读/写共享首选项文件(它们实际存储在文件中)的代码检查在读/写之前是否对文件进行了任何更改,并相应地更新了它们的缓存版本。
在Android> 2.3它有效,但你需要在调用MODE_MULTI_PROCESS
时专门设置getSharedPreferences()
。
在Android 2.3中,它被破坏了,它不起作用: - (
请注意,API Level 23 (Android M)中已弃用MODE_MULTI_PROCESS
。
答案 1 :(得分:9)
You can check out https://github.com/hamsterksu/MultiprocessPreferences库,它提供类似SharedPreferences的API,以通过ContentProvider访问SharedPreferences数据。谷歌从Android 6中删除了MODE_MULTI_PROCESS后,它看起来也是一个很好的替代品。
答案 2 :(得分:0)
没有;这样做是不安全的。你引用的注释是正确的。如果您尝试跨多个进程使用SharedPreferences
,则可能会出现已知问题。 (见https://code.google.com/p/android/issues/detail?id=66625。)
如果您需要更多证明,请查看SharedPreferencesImpl
的源代码,尤其是保存首选项的部分。
我通过阻止两个进程同时访问SharedPreferences
文件来解决这个问题。 (这里是one way to provide cross-process locking,而这里是a complete example implementation I wrote。)
警告:不幸的是,Android M中已弃用MODE_MULTI_PROCESS
,因此可能会在以后的版本中停止工作。另一种技术,例如使用ContentProvider
可能是更好的选择。