进程共享
条件1.sharedUserId相同
我们知道,Android上的各个APP是用户分离的,每个APP都有不同的UserId,这种共享数据的方式要求这两个APP必须是相同的UserId。
在AndroidManifest.xml中的manifest标签,我们需要设置两个APP的sharedUserId,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xiechen.sourceapp"
android:sharedUserId="xxcc.com">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
条件2 签名一致
要用这种方式,两个APP的签名也要求一致,所以比较适用于属于自己的多个APP之间共享数据。
核心代码
假设有A和B两个应用,我们来实现AB之间实时的读取和写入userId。
A应用
private SharedPreferences mPreference;
mPreference = getSharedPreferences("userId", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE| MODE_MULTI_PROCESS);
// 写入EditText中的值
SharedPreferences.Editor editor = mPreference.edit();
editor.putString("userId", mValueET.getText().toString().trim());
editor.commit();
// 读取
String userId = mPreference.getString("userId", "000");
mResultTV.setText(userId);
B应用
private SharedPreferences mPreferences;
private Context targetAPPContext;
try {
// 尝试创建A应用的Context
targetAPPContext = createPackageContext("com.example.xiechen.sourceapp", CONTEXT_IGNORE_SECURITY);
// 从A应用中取得配置文件
mPreferences = targetAPPContext.getSharedPreferences("userId",
MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE |MODE_MULTI_PROCESS);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
// 读取
String userId = mPreferences.getString("userId", "000");
// 写入
SharedPreferences.Editor editor = mPreferences.edit();
editor.putString("userId", mWriteET.getText().toString().trim());
editor.commit();
注意事项
AB应用需要读写的配置文件名称必须一样,如上述代码中的”userId”,最终生成的文件名是userId.xml;
为了能实时读写,SharedPreferences的MODE必须加 MODE_MULTI_PROCESS,读和写模式看具体需求情况。
SharedPreferences本质上也属于文件的一种,但是系统对它的读写有一定的缓存策略,即在内存中会有一份SharedPreferences文件的缓存,虽然可以用MODE_MULTI_PROCESS实现多进程模式,但是依然不可靠,面对高并发的读写访问,而且会有很大几率丢失数据,所以不是很建议在进程间通信使用它。
性能
SharePreference性能优化,可以做进程同步吗?
在Android中, SharePreferences是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件
存放在/data/data/ < package name > /shared_prefs目录下.
之所以说SharedPreference是一种轻量级的存储方式,是因为它在创建的时候会把整个文件全部加载进内存,如果SharedPreference文件比较大,会带来以下问题:
-
第一次从sp中获取值的时候,有可能阻塞主线程,使界面卡顿、掉帧。
-
解析sp的时候会产生大量的临时对象,导致频繁GC,引起界面卡顿。
-
这些key和value会永远存在于内存之中,占用大量内存。
优化建议
-
不要存放大的key和value,会引起界面卡、频繁GC、占用内存等等。
-
毫不相关的配置项就不要放在在一起,文件越大读取越慢。
-
读取频繁的key和不易变动的key尽量不要放在一起,影响速度,如果整个文件很小,那么忽略吧,为了这点性能添加维护成本得不偿失。
-
不要乱edit和apply,尽量批量修改一次提交,多次apply会阻塞主线程。
-
尽量不要存放JSON和HTML,这种场景请直接使用JSON。
-
SharedPreference无法进行跨进程通信,MODE_MULTI_PROCESS只是保证了在API 11以前的系统上,如果sp已经被读取进内存,再次获取这个SharedPreference的时候,如果有这个flag,会重新读一遍文件,仅此而已。
参考:https://blog.youkuaiyun.com/hwe_xc/article/details/50788591
https://www.cnblogs.com/ldq2016/p/9035666.html
版权声明:本文为博主原创文章,转载请附上博文链接!