在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得不分开,但是桌面部分需要获取该应用的数据,就是该应用切换数据,然后发送广播给桌面程序,桌面程序获取该应用的数据!
需要的数据不多,所以之前该应用融合在桌面的时候就是使用的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("木有找到该包名"); } }
相关推荐
在Android开发中,...通过这两个示例项目,开发者可以学习到如何在Android中使用SharedPreferences进行数据存储,以及如何实现跨应用的数据共享。理解并熟练运用这些知识点对于创建功能丰富的Android应用至关重要。
总之,通过注解生成SharedPreferences包装类是一种有效的解决跨进程数据访问不同步的方法。它提高了代码的可维护性和安全性,简化了多进程环境下的数据管理。在实际开发中,我们可以根据需求自定义注解和处理器,以...
但在某些情况下,我们可能需要在不同的应用程序之间共享数据,这就涉及到跨应用SharedPreferences的共享问题。 在Android中,实现不同应用间的数据共享主要有以下几种方法: 1. **ContentProvider**:Android系统...
ContentProvider封装SharedPreferences功能,解决跨进程存取值的问题, 我之前一直用自己封装的SharePreferences,后来出现跨进程问题;就用这个 ContentProvider,真好用,值得拥有!
`SharedPreferences`是Android提供的一种轻量级的数据存储方式,主要用于保存应用程序的简单配置数据,如布尔值、整型、浮点型、字符串等。这篇博客将深入探讨如何使用`SharedPreferences`进行数据存储,以及其背后...
在Android系统中,数据共享是应用之间相互交互的重要方式,特别是...对于更复杂的数据共享需求,如大量结构化数据,推荐使用ContentProvider配合SQLite数据库或者使用其他的跨进程通信(IPC)机制,如 Binder 或 AIDL。
SharedPreferences实际上是通过XML文件存储数据的,位于应用的私有数据目录下,如`/data/data/your.package.name/shared_prefs/MyPreferences.xml`。每次调用`apply()`或`commit()`,系统都会更新这个XML文件。 当...
在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。 只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。 ...
在没有网络的情况下,通过SharedPreferences来存储之前从网络获取的数据,可以实现离线状态下应用依然能够正常运行和展示信息,从而有效地节省用户的流量。 以下是对SharedPreferences存储数据的详细步骤和知识点:...
SharedPreferences可以让不同程序之间的数据进行共享,当两个应用程序之间数据需要传递或者共享时,可以使用这个方法。本文会使用两个例子SharePreferenceWrite和SharePreferenceRead,前者为一个写...
在Android应用开发中,SharedPreferences是Android提供的一种轻量级的数据存储方式,主要用于存储一些简单的配置信息,如用户偏好设置、应用程序的状态等。它是一个键值对的存储系统,支持基本数据类型,如布尔型、...
在Android应用开发中,SharedPreferences是Android提供的一种轻量级的数据存储方式,主要用于存储应用程序中的配置信息或者用户的一些简单设置。这个实验旨在让你了解并掌握如何使用SharedPreferences来存储和读取...
Android项目开发中使用的数据存储方式有:网络存储、sqlite存储、File存储和SharedPreferences存储,四种存储方式对应的Demo别人是NetworkDemo、SqliteDemo、FileDemo和SharedPreferencesDemo,根据应用的场景选择...
在Android应用开发中,SharedPreferences是Android提供的一种轻量级的数据存储方式,主要用于存储应用程序的配置信息或者用户的一些简单设置。它的优点在于操作简单、效率高,适用于存储非频繁变动且数据量不大的...
android应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demoandroid应用SharedPreferences_Demo...
SharedPreferences通常在不同的Activity之间共享数据,只要它们属于同一个应用程序,并且使用相同的名称来获取SharedPreferences实例。 5. **生命周期**: SharedPreferences的数据是持久化的,即使应用程序被...
ContentProvider封装SharedPreferences功能,解决跨进程存取值的问题-附件资源
SharedPreferences 是 Android 中的一种轻量级的数据存储方式,主要用来存储应用程序中的配置信息、用户偏好设置等。SharedPreferences 使用键值对的方式来存储数据,通过put方法将数据写入到文件中,並使用get方法...