基于项目中遇到的技术问题,谈谈SharedPreferences的使用的注意问题

    前段时间一个项目里用到的进程间共享数据的问题,一般说来进程间共享数据包括SharedPreferences、文件、数据库访问。

SharedPreferences是轻量级访问,给开发者带来了很多便利,存储的数据是轻量级的,例如配置文件的变量、或者是程序运行时保存的

某个值,便于其他activity或service访问使用。当然也可以用文件和sqlite数据库,数据量大,记录的内容和种类很多的话,建议

毫不犹豫的选择数据库。文件的访问也可以实现SharedPreferences一样的功能,只不过相比开发量来说,还是SharedPreferences方便。

    本来觉得SharedPreferences共享数据很简单,然后在项目中,这个SharedPreferences给我带来了很多烦恼,发现共享的数据不能被其他服务

访问,或者访问的内容不同步。折腾了3天,终于把问题解决。SharedPreferences如何使用我就不多说了,百度一大堆使用例子。

    现在简单说说SharedPreferences,说白了,SharedPreferences也是通过一个xml文件进行共享数据的。它一般放在/data/data/包名/文件名.xml

    public final static  String SHARE_PRE_FILE = "my_push_on_prefs";
    sharedPrefsFile =ctx.getSharedPreferences(SHARE_PRE_FILE, context.MODE_MULTI_PROCESS);

 getSharedPreferences的第一个参数就是文件名称,第二个参数是权限如下:

Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
MODE_MULTI_PROCESS 在Android 2.3以后的Android版本,必须通过明确的将MODE_MULTI_PROCESS这个值传递给mode参数,才能开启多进程访问。
项目里是两个服务共享数据,也就是多进程间共享数据。
 
还有一点关键的问题,参考文章http://blog.csdn.net/ns_code/article/details/11271053 《Android中Sharedpreferences牵涉到跨进程时不能实时读取的问题》
问题出在manifest.xml文件的配置:先看看我原来是怎么配置的
1 <service android:process=":a" android:name="com.cn.app.aservice"></service>
2 <service android:process=":b" android:name="com.cn.app.bservice"></service>

android:process这个属性是指以独立的进程运行,如果不使用android:process属性的话,a和b服务将在依赖于同一个进程,也就是说a和b共享同一个进程。

上面的xml说明a和b都是采用独立的进程运行,访问SharedPreferences,共享数据访问的内容是不一样的。

即SharedPreferences虽然说是进程间共享,第一两个进程是在同一个包,第二两个进程共享一个进程,如果各自独立运行,SharedPreferences将失效。

1 <service android:name="com.cn.app.aservice"></service>
2 <service android:name="com.cn.app.bservice"></service>

修改为上面的样子,能够正常访问共享数据了。
如果有什么技术问题,欢迎大家共同交流 qq群263862916

原文地址:https://www.cnblogs.com/mytech/p/4037178.html