在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得不分开,但是桌面部分需要获取该应用的数据,就是该应用切换数据,然后发送广播给桌面程序,桌面程序获取该应用的数据!
需要的数据不多,所以之前该应用融合在桌面的时候就是使用的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("木有找到该包名"); } }
相关推荐
通过注解生成SharedPreferences包装类,解决跨进程数据访问不同步的问题
SharedPreferences文件在不同应用之间数据共享
共有两个程序,其中1.2SimplePreference是用来写入的,1.2SharePreference是用来读取的。
ContentProvider封装SharedPreferences功能,解决跨进程存取值的问题, 我之前一直用自己封装的SharePreferences,后来出现跨进程问题;就用这个 ContentProvider,真好用,值得拥有!
SharedPreferences可以让不同程序之间的数据进行共享,当两个应用程序之间数据需要传递或者共享时,可以使用这个方法。本文会使用两个例子SharePreferenceWrite和SharePreferenceRead,前者为一个写...
主要介绍了Android 跨进程SharedPreferences异常详解的相关资料,需要的朋友可以参考下
Android项目开发中使用的数据存储方式有:网络存储、sqlite存储、File存储和SharedPreferences存储,四种存储方式对应的Demo别人是NetworkDemo、SqliteDemo、FileDemo和SharedPreferencesDemo,根据应用的场景选择...
android应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demo...
ContentProvider封装SharedPreferences功能,解决跨进程存取值的问题-附件资源
本文介绍了SharedPreferences保存应用程序数据的具体步骤,供大家参考,具体内容如下 1、SharedPreferences的简单介绍 应用程序在运行的时候,可能会随着用户的使用而保持该用户的配置信息,如上次播放时的eq设置,...
SharedPreferences可以让不同程序之间的数据进行共享,当两个应用程序之间数据需要传递或者共享时,可以使用这个方法。这里使用两个例子TestSharePreference和TestSharePreference2,前者为一个写SharedPreferences...
在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。 只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。 ...
实验 如何读SharedPreferences记录数据 和写数据类似,需要getSharedPreferences返回应用中的数据对象,但不需要返回editor。 通过getString getInt等方法获得指定数据,如果数据不存在,方法会提供默认值。 谢谢 ...
SharedPreferences存储获取信息,其中也用到了ActionBar设置菜单
实验九 使用SharedPreferences存储简单数据
简单存储SharedPreferences的应用实例:增删改查联系人。 在目标界面中,有两个文本编辑框,用于输入姓名和电话号码。然后有4个按钮,分别是:添加,查询,删除和更新。 博客地址:...