SharedPreferences跨应用跨进程获取数据(附件)
程序员文章站
2024-03-17 20:04:28
...
在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得不分开,但是桌面部分需要获取该应用的数据,就是该应用切换数据,然后发送广播给桌面程序,桌面程序获取该应用的数据!
需要的数据不多,所以之前该应用融合在桌面的时候就是使用的SharePreferences保存,但是现在分开了,就要跨进程了,要么就用ContentProvider结合SQLite将数据暴漏给桌面程序(但是需要的数据很简单,所以觉得用这种方式太麻烦了),要么操作相同的一个文档(可能被其他程序更改,不安全),要么继续使用SharePreferences。
但是之前使用的SharePreferences都是使用模式Context.MODE_PRIVATE,这样就不能被其他程序访问到,开始一直以为这样的文档只能被本应用使用,后来查了很多资料发现使用不同的模式可以实现跨进程,跨应用获取该文件内容(写了个demo来测试一下,见附件):
程序ShareDataB相当于一个主程序,只用来获取客户端程序ShareDataA中SharePreferences的数据。
程序a点击按钮来切换数据:
SharedPreferences share = getSharedPreferences(SHARED_FILE_NAME, Context.MODE_WORLD_READABLE);
boolean preBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
// 更改share里的值
share.edit().putBoolean(SHARED_FILE_BOOLEAN_VALUE, !preBooleanValue).commit();// 改变值
boolean afterBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
mValueText.setText(afterBooleanValue + "");
而程序b则在onresume的时候获取程序a中数据:
private static final String TARGET_PACKAGE_NAME = "com.example.sharedataa";// 目标数据程序的包名,
/**
* 根据目标程序的包名来获取其程序的上下文
* @return
* @throws NameNotFoundException
*/
private Context getTargetContext() throws NameNotFoundException {
return createPackageContext(TARGET_PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
}
/**
* Context.MODE_MULTI_PROCESS一定要添加,按理说只要Context.MODE_WORLD_READABLE 即可
* <p>
* 但是,如果只有Context.MODE_WORLD_READABLE 的话,即使另一个程序改变了值,这个程序得到的值永远都是第一次获取的值
* <p>
* 不会随着其他程序改变而改变
*/
@Override
protected void onResume() {
super.onResume();
try {
SharedPreferences share = getTargetContext().getSharedPreferences(SHARED_FILE_NAME,
Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);
boolean afterBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
mBooleanValueText.setText(afterBooleanValue + "");
} catch (NameNotFoundException e) {
e.printStackTrace();
mBooleanValueText.setText("木有找到该包名");
}
}
上一篇: 存储过程实现批量插入数据