25

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

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

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

谢谢你的帮助

4

3 回答 3

37

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

在 Android > 2.3 中它可以工作,但您需要MODE_MULTI_PROCESS在调用时专门设置getSharedPreferences().

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

请注意,在API Level 23 (Android M)MODE_MULTI_PROCESS中已弃用。

于 2012-08-27T14:53:13.083 回答
9

您可以查看https://github.com/hamsterksu/MultiprocessPreferences库,该库提供了类似 SharedPreferences 的 API,用于通过 ContentProvider 访问 SharedPreferences 数据。在 Google 从 Android 6 中删除 MODE_MULTI_PROCESS 之后,它看起来也是一个不错的替代品。

于 2015-08-27T14:20:14.890 回答
0

不; 这样做是不安全的。你引用的注释是正确的。如果您尝试SharedPreferences跨多个进程使用,可能会出现已知问题。(见https://code.google.com/p/android/issues/detail?id=66625。)

如果您想要更多证据,请查看 的源代码SharedPreferencesImpl,尤其是保存首选项的部分。

我通过阻止两个进程同时访问SharedPreferences文件来解决这个问题。(这是提供跨进程锁定的一种方法,这是我编写的完整示例实现。)

警告:不幸的是,MODE_MULTI_PROCESS它在 Android M 中已被弃用,因此它可能会在以后的版本中停止工作。诸如使用 a 之类的替代技术ContentProvider可能是更好的选择。

于 2015-07-09T13:04:16.120 回答