SharedPreference进程共享及性能优化

本文详细介绍了在Android中如何通过设置sharedUserId和确保签名一致,实现不同应用间的进程数据共享。利用SharedPreferences,演示了A、B两个应用如何实现实时读写userId数据,并讨论了注意事项与性能优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程共享

条件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文件比较大,会带来以下问题

  1. 第一次从sp中获取值的时候,有可能阻塞主线程,使界面卡顿、掉帧。

  2. 解析sp的时候会产生大量的临时对象,导致频繁GC,引起界面卡顿。

  3. 这些key和value会永远存在于内存之中,占用大量内存。

优化建议

  1. 不要存放大的key和value,会引起界面卡、频繁GC、占用内存等等。

  2. 毫不相关的配置项就不要放在在一起,文件越大读取越慢。

  3. 读取频繁的key和不易变动的key尽量不要放在一起,影响速度,如果整个文件很小,那么忽略吧,为了这点性能添加维护成本得不偿失。

  4. 不要乱edit和apply,尽量批量修改一次提交,多次apply会阻塞主线程。

  5. 尽量不要存放JSON和HTML,这种场景请直接使用JSON。

  6. 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
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值