创建两个工程,一个是 com.sharepreference.write (A应用) 用于写入数据,另外一个是 com.sharepreference.read (B应用) 用于读取数据,下面分别看看两个工程的关键代码:
(A)写入数据的代码:
- //按钮
- Button btnWrite=(Button)findViewById(R.id.btnWrite);
- //输入框
- final EditText et=(EditText)findViewById(R.id.editValue);
- //创建sp对象,模式是 MODE_WORLD_READABLE
- final SharedPreferences sp=getSharedPreferences("test_sp",MODE_WORLD_READABLE);
- final Editor editor=sp.edit();
- btnWrite.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- //写入并提交
- editor.putString("name", et.getText()+"");
- editor.commit();
- Toast.makeText(MainActivity.this,sp.getString("name", ""),Toast.LENGTH_SHORT).show();
- }
- });
(B)读取数据的代码:
- //按钮
- Button btnRead = (Button) findViewById(R.id.btnRead);
- //显示数据的文本框
- final TextView tv = (TextView) findViewById(R.id.txtValue);
- Context context=null;
- try {
- //创建上下文,指定宿主应用的包名以及 忽略系统的安全过滤,这点切勿忽视!
- context=createPackageContext("com.sharepreference.write", Context.CONTEXT_IGNORE_SECURITY);
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- sp=context.getSharedPreferences("test_sp", MODE_WORLD_READABLE);
- btnRead.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i("Read",sp.getString("name",""));
- //读取数据
- String name = sp.getString("name", "");
- if (name != "") {
- tv.setText(sp.getString("name", ""));
- } else {
- tv.setText("尚未写入值");
- }
- }
- });
问题:
A应用写入后,第一次B应用能够正确读取到数据,第二次再从A应用修改数据的时候 为啥B应用还是拿到旧的数据? (没有退出应用的前提下)
答案是:这种跨应用的共享,B应用是一次性读进了内存,在应用程序杀掉之前,都是从内存中拿的,所以实际上是B应用将其缓存下来了。
解决方法:
在B应用中获取sharepreference时, 使用sp=context.getSharedPreferences("test_sp", MODE_MULTI_PROCESS); 就可以得到最新的数据