请教各位高手有关SharedPreferences跨应用读取数据的问题
我写了两个不同的应用程序,然后其中一个程序A利用SharedPreferences来读取另一个程序B写入的数据。现在出现了一个奇怪的问题:程序A第一次启动后可以读取到程序B写入的数据,但是当我利用Android模拟器上的返回键退出程序A,然后启动程序B对数据进行修改并写入XML文件后,再次启动程序A,按道理程序A读取到的数据应该是修改后的数据,但是结果仍然是程序A第一次启动时读取到的数据,而不是修改后的数据,无论我在程序B里对数据进行多少次修改,程序A都只能读取到第一次的数据。
想问下各位高手,为什么会出现这种情况?
相关程序我打包上传到CSDN上了,下载地址如下:http://download.csdn.net/detail/gcsdn2000/4161520
共有两个程序,其中1.2SimplePreference是用来写入的,1.2SharePreference是用来读取的。
----------------------------------------------
另外我在查找原因的时候,发现用模拟器上的返回键退出程序时,程序虽然已经执行了onDestroy(),但是其实还是在模拟器后台缓存里存在着,这个可以通过“应用程序->正在运行->显示缓存进程”里看到。
如果这时我在“显示缓存进程”里强制停止程序A,然后再次回去执行程序A,程序A就可以读取到更新后的数据了,但是仍然只能读取到第一次的数据,除非每次都强制停止程序。当然通过System.exit(0);也可以达到同样的效果。
现在问题是:既然程序B已经修改了数据(这个我通过File Explorer提取XML文件查看后数据的确已经修改了),按道理无论程序A是否完全退出,每次执行应该都读到更新后的数据,那为什么还是显示第一次读取到的数据呢?
程序A肯定执行了完整的生命周期,从启动执行到通过模拟器上的返回键退出然后再执行,只是还驻留在缓存里,这对数据的更新会有影响吗?
主要的读取数据代码如下:
try {
c = this.createPackageContext(PREFERENCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences sharedPreferences = c.getSharedPreferences(PREFERENCE_NAME, MODE);
String name = sharedPreferences.getString("Name","Tom");
int age = sharedPreferences.getInt("Age", 20);
float height = sharedPreferences.getFloat("Height",1.81f);
String msg = "";
msg += "姓名:" + name + "\n";
msg += "年龄:" + String.valueOf(age) + "\n";
msg += "身高:" + String.valueOf(height) + "\n";
labelView.setText(msg);
按理说每次执行都应该读取到最新的数据,但是测试结果,这些变量的值都是第一次读到的值,不会有变化,除非从缓存中完全退出,然后再次启动才会读到最新的值。即使缓存里保留了老的值,但是当执行上述代码是应该读到新的值,然后把老的值覆盖掉,这样就应该显示新的值,难道Android和其他系统的不一样?
有高手能说下问什么会出现上面的那种情况?我自己实在无法找到合理的解释。
先谢谢了!