SharedPreferemces在低版本上是支持多进程的,但其多进程操作不安全,后续不再支持。通过前文我们知道,可以通过
SharedPreferences sharedPreferences = context.getSharedPreferences("hello",MODE_PRIVATE);
来获取SharedPreferences接口的实现类SharedPreferencesImpl的实例对象,getSharedPreferences方法原型如下:
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
// ... 省略内容
}
其需要两个参数,String类型的name,其取值为所要访问的xml文件名称,int型的mode,取值为SharedPreferences文件的访问方式,SharedPreferences访问模式有5种,分别为:
- MODE_PRIVATE:默认操作模式,表示所访问的文件为应用私有文件,只有当前应用才能访问,该模式下,写入的内容会覆盖原文件的内容
- MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
- MODE_WORLD_READABLE:表示所创建的文件,所有应用都可读,已弃用
- MODE_WORLD_WRITEABLE:表示所创建的文件,所有应用都可写,已弃用
- MODE_MULTI_PROCESS:表示所创建的文件,支持多进程读写,已弃用
从SharedPreferences的创建模式来看,理论上来讲,SharedPreferences是支持多进程的,但是随着系统版本迭代,跨进程相关的模式基本都被弃用了,主要原因在于SharedPreferences提供的这些访问模式多进程环境下不安全。
所有应用可读写,不安全
针对MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE模式而言,其过于开放,没有合理机制校验操作方信息,所以必然是不安全的。
在Android 7.0以上,如果我们使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE创建SharedPreferences会直接抛出异常,相关代码如下所示:
MODE_MULTI_PROCESS,不可靠,不安全
在Android源码中,关于MODE_MULTI_PROCESS的注释如下:
SharedPreference loading flag: when set, the file on disk will be checked for modification even if the shared preferences instance is already loaded in this process. This behavior is sometimes desired in cases where the application has multiple processes, all writing to the same SharedPreferences file. Generally there are better forms of communication between processes, though. This was the legacy (but undocumented) behavior in and before Gingerbread (Android 2.3) and this flag is implied when targeting such releases. For applications targeting SDK versions greater than Android 2.3, this flag must be explicitly set if desired. Deprecated MODE_MULTI_PROCESS does not work reliably in some versions of Android, and furthermore does not provide any mechanism for reconciling concurrent modifications across processes. Applications should not attempt to use it. Instead, they should use an explicit cross-process data management approach such as ContentProvider. See Also: getSharedPreferences
从这段注释我们可以明显看出MODE_MULTI_PROCESS在有些Android版本上是不可靠的,而且并没有提供任何协调进程间并发修改的机制,所以MODE_MULTI_PROCESS在跨进程共享数据方面也不可靠,不安全。
从MODE_MULTI_PROCESS模式的代码逻辑部分也可以看出其并不具备处理并发的能力,MODE_MULTI_PROCESS工作的源码如下所示:
可以看出针对MODE_MULTI_PROCESS模式而言,只是要求获取SharedPreferences时,重新从文件加载数据而已。
那么怎么使用SharedPreferences在进程间共享数据呢?上文源码注释中也有说明,使用ContentProvider包裹SharedPreferences即可,当然我们也可以通过文件锁,MMKV等其他方式来实现目标。