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

时间:2012-08-25 19:59:29

标签: android sharedpreferences android-service

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

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

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

感谢您的帮助

3 个答案:

答案 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可能是更好的选择。

相关问题