SharedPreference做为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大数据的工具,以key/value成对的形式来存储基本数据类型,只能存储基本数据类型。文件存放在/data/data/your packagename/shared_prefs目录下。android 文件存储格式以下:数据库 <?xml version=’1.0’ encoding=’utf-8’standalone=’yes’ ?>网络 <map>ide <boolean name=“key” value=”true”/>工具 <string name=”key”>hello</string>大数据 </map>ui SharedPreference最适合使用的地方就是保持配置信息,Android中专门有针对偏好设置的PreferenceFragment中的数据存储也是使用SharePreference来存储,默认的文件名为(your packagename)_preferences.xml中。若是要修改默认文件名,能够经过在PreferenceFragment中使用getPreferenceManager().setSharedPreferencesName(“modify_default_preference”)来更改默认文件名。spa 这些都不重要哈,重要的是在多进程中修改同一个值出现的问题。为了方便描述,将第一次建立某个SharedPreference xml的进程描述为为主进程,次使用该xml文件的为次进程xml 不一样进程是指在ddms中看到的不一样进程,包括不一样应用(shareduid一样在内哦),同一个应用中配置process产生的次进程。他们之间进行通讯都会形成主进程修改值以后,在次进程读取到的仍是第一次初始化时读取到的值。目前网络上尚未很好的解决办法,个人解决办法以下:进程 一、首先要将获取SharedPreference的MODE设置为: MODE_MULTI_PROCESS 。其值为4(2.3之后有该属性)。如: getSharedPreferences("test_aa", MODE_MULTI_PROCESS);.若是是使用MODE_PRIVATE这种模式,那么另外一个进程中写入的值,将不会写到文件中。 二、其次为了保证修改数据实时提交到磁盘,不要将SharedPreference设置成成员变量,尽可能在哪里修改就在哪里直接获取SharedPreference,修改后别忘记commit。
若是作到了上面两点,不出意外的话,数据就能够作到实时修改了。若是为了方便已经写了SharedPreference编辑的工具类,那么第二点基本就作不到了,so,须要作第三步。 三、若是两个进程都须要适时读取或根据该值进行逻辑操做,那么最好在两个进程中都进行Editor操做。可使用Service和aidl技术,aidl对于这种基本类型的传递so easy。
出现这种问题的缘由,我还没总结完,正在总结中…敬请期待!
最后:对于分享数据来讲:若是是瞬时分享数据,不须要长期保存的话可使用广播。若是要分享大量数据的话使用 ContentProvider是最好的选择。你们都知道的啦。 |