SharedPreference 实现不同进程间的数据共享

文章出处:https://blog.csdn.net/shift_wwx/article/details/9243109

请转载的朋友标明出处~~

 

详解可以看一下:SharedPreferences 详解

sharedpreference大家肯定很熟悉,一般用于数据的存储。

如下:

private void getSharedPreference(){
    SharedPreferences mShare = getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE);
    mShare.getString("key", "default");
}
	
private void setSharedPreference(){
    SharedPreferences mShare = getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE);
    Editor mEditor = mShare.edit();
    mEditor.putString("key", "hehe");
    mEditor.commit();
}


那么不同的进程是否可以共享一个sharepreference的xml呢?

下面做了两个简单的apk。

Activity A:

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	private SharedPreferences mPreferences;
	private static final String SHARED_NAME = "test_share";
	private static final int SHARED_MODE = Context.MODE_PRIVATE;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button save = (Button)findViewById(R.id.save);
		save.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				setSharedPreference();
			}
		});
	}
	
	private void setSharedPreference(){
		Log.d(TAG, "======setSharedPreference=======");
		mPreferences = getSharedPreferences(SHARED_NAME, SHARED_MODE);
		Editor mEditor = mPreferences.edit();
		mEditor.putString("key", "12345");
		mEditor.commit();
	}
}

Activity B:

public class MainActivity extends Activity {
	private static final String TAG = "B";
	Context mContext;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button get = (Button)findViewById(R.id.get);
		get.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				getSharedPreference();
			}
		});
		
		Button set = (Button)findViewById(R.id.set);
		set.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				setSharedPreference();
			}
		});
	}
	
	private void getSharedPreference(){
		try {
			mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_READABLE);
		Log.d(TAG, "======"+mShare.getString("key", "error"));
	}
	
	private void setSharedPreference(){
		try {
			mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_WRITEABLE);
		Editor mEditor = mShare.edit();
		mEditor.putString("key", "hehe");
		mEditor.commit();
	}

}

虽然通过以下code能获取到对应的对象,但是a中的mode设置的为Context.MODE_PRIVATE

会提示一个错误:Couldn't rename file /data/data/....PREFERENCES_NAME.XML to /data/data/....PREFERENCES_NAME.XML.bak

try {
    mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_READABLE);

但是是否改成Context.MODE_WORLD_WRITEABLE或者是Context.MODE_WORLD_READABLE就可以了呢?

答案是不行,所以这一步是走不通的。

 

经过研究发现只要将android:sharedUserId="com.shift.test"两个进程设置为一样的就可以了,而且mode设为任何一个都是ok的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值