程序之间共享数据SharedPreferences(二)--sharedUserId

本文探讨了在Android应用程序中使用SharedPreferences进行数据共享的方法,并指出通过设置sharedUserId来实现特定程序间的共享,强调了共享数据的安全性和签名一致性的重要性。

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

在程序之间共享数据SharedPreferences(一)中,已经介绍了如何通过SharedPreferences实现程序之间的数据共享。但是,在getSharedPreferences的时候,必须用到Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE。还有,一旦这个程序用了这两个,将可被外部程序所访问,且无权限。那么,如果想指定某个程序访问呢?或者有一个这样的需求,一个公司开发了两个程序,然后又想两个程序间共享数据,甚至不止多个程序共享。

通过设置同一个sharedUserId可解决问题。

App1代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="com.app"
    package="com.kv.app1">

    <application android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <activity android:name=".App1Act1">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

public class App1Act1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act1);
        final SharedPreferences pref = getSharedPreferences("cfg", Context.MODE_PRIVATE);
        final SharedPreferences.Editor editor = pref.edit();

        final TextView tv = (TextView) findViewById(R.id.tv);

        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editor.putString("abc", "123");
                editor.commit();
            }
        });

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv.setText("abc=" + pref.getString("abc", ""));
            }
        });

    }
}


App2代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="com.app"
    package="com.kv.app2">

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <activity android:name="com.kv.app2.App2Act1">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

public class App2Act1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act1);
        final TextView tv = (TextView) findViewById(R.id.tv);


        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv.setText("abc=" + getMsg());
            }
        });


    }

    private String getMsg() {
        try {
            Context context = createPackageContext("com.kv.app1",
                    Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
            SharedPreferences pref = context.getSharedPreferences("cfg", MODE_PRIVATE);
            String value = pref.getString("abc", "");
            return value;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;

    }
}

以上代码可以看出,App1和App2都设置了同一个sharedUserId,然后即使在getSharedPreferences的时候用了MODE_PRIVATE,还是可以访问到。

当然,shardUserId,必须是要签名一致,不然会报错误 :[INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值