最近项目中需要两个应用间公用数据,由于考虑到只有少量标识需要共享,就考虑用sharedpreferences生成XML进行数据存储。
需求如下:A应用中生成xml文件,并存储一个键值对 key-value.
A应用会对value进行维护修改
B应用获取该xml文件中key对应的value。
我在A应用中生成并写入相应数据:
SharedPreferences sp = getSharedPreferences("test", MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
sp.edit().putString("key1", "value").commit();
Log.i("shared", sp.getString("key1", "0"));
在B应用中读取:
Context context = null;
try {
context = createPackageContext("com.me.myfirsttest",CONTEXT_IGNORE_SECURITY);//"com.me.myfirsttest"是应用A的包名
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences settings = context.getSharedPreferences("test", MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
String userName = settings.getString("key1", "default");
Toast.makeText(getApplicationContext(), userName, 1).show();
能读取到A应用中key1对应的值。
但是当A应用中key1对应的值修改后,退出应用,B应用再读取的时候,读出的值仍然为第一次读到的值。怎样才能做到让B应用同步获取该值呢?
只需要将B应用中的
SharedPreferences settings = context.getSharedPreferences("test", MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
修改为
SharedPreferences settings = context.getSharedPreferences("test", MODE_MULTI_PROCESS);
即可。
具体原因应该是脏读问题,等有空再研究吧