我记得SharedPreferences 不能跨应用读取数据吧,使用contentprovider它吧。

解决方案 »

  1.   

    在 Back 按钮的时候调用 finish() 试一试
      

  2.   

    SharedPreferences是一种轻量级的数据保存方式 采用键值对NVP保存在文件系统中可用于保存数据以及实现不同应用程序间的数据共享支持3种访问模式●MODE_PRIVATE 私有●MODE_WORLD_READABLE 全局读●MODE_WORLD_WRITEABLE 全局写我又特意查了一下  确实是的  是不是 模式没有写对
      

  3.   

    试过了,没有用,其实用了finish()程序依然驻留在缓存里
    只有用System.exit(0);才能完全退出缓存。
      

  4.   

    public static int MODE = Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE;
    我这里实验可以
      

  5.   

    不知道这里说的可以是指什么可以,这个模式没什么问题吧,我用的是如下:
    public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
      

  6.   

    我下载你的程序试过了,,没有问题,
    我再想是不是你模拟器有问题啊你可以试试把工程1.2sharepreferenceg中的SharePreferenceActivity类中oncreate()方法中的代码:
    Context c = null;
            labelView = (TextView)findViewById(R.id.label);  
            
    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);   

    Toast.makeText(this, name, Toast.LENGTH_SHORT).show();放到onResume()方法中因为你有时候点击back再次进入程度时oncearte()方法可能没有调用,因为你的程序只是切换到了后台
      

  7.   

    我也以为sharedpreference不能跨应用读取的
      

  8.   

    。只是写demo的时候玩过一下,真实开发估计没什么人用这玩意搞楼主说的是脏读这个可能是google实现的问题,但同一个应用中不会出现脏读的现象
      

  9.   

    再次启动程序A,按道理程序A读取到的数据应该是修改后的数据
    -----------------------------------------------------
    lz 可以看看你的Oncreate方法有没有再次执行啊
      

  10.   

    ----------------------------
    谢谢!看来应该就是这个问题了。
    -----------------------
    看了,Oncreate方法再次执行了。
    应该是模拟器的问题。
      

  11.   

    在A中MODE+Context.MODE_MULTI_PROCESS,试一下
      

  12.   

    可以跨应用读取数据  context 的时候获取到 你要读取的那个包名就ok 就是那个类似于 android.xxx.xxx的那个东西 不过前提是你的sharedpreference 设置的可以共享
      

  13.   

    我也遇到和LZ一样的问题 , 不知道LZ解决的没有,不能理解,为什么不能更新
      

  14.   

    LZ 我解决了在B那边用MODE_MULTI_PROCESS 不要用MODE_WORLD_READABLE
      

  15.   

    你可以在B程序对数据修改以后拉出来那个XML 看存储信息,很容易看懂的,然后就知道修改是否有效
      

  16.   

    可能是另外一个activity 没有完全退出  可以尝试关闭再读取
      

  17.   

    MODE_MULTI_PROCESS 这个是从什么地方来的?我看到的只有 MODE_PRIVATE MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 这三个啊~~这个问题在 三星和中兴的手机上都试过,都会出现读的是缓存的旧数据,期待高手解答啊~~
      

  18.   

    首先 每次B修改完 把那个xml 推出来看看是否 数据真的改变过android 如何读取其他应用的SharedPreferences
    大家可能没有留意  getPreferences()这个方法调用的时候需要上下文环境,也就是调用的时候隐式的省略了this
    this.getPreferences(); 而在应用中这个this 可以理解为包名环境。
    所以如何使外部应用分享该应用的数据打架可以晓得了。
    以下贴出代码
    public class SharedataActivity extends Activity {
        SharedPreferences mSharedPreferences;
        Context mContext;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            try {//org.example.test数据存放的包名
    mContext = createPackageContext("org.example.test", Context.CONTEXT_IGNORE_SECURITY);
    } catch (NameNotFoundException e) {
    Toast.makeText(getApplicationContext(), "shibai", Toast.LENGTH_SHORT).show();
    e.printStackTrace();
    }
    mSharedPreferences = mContext.getSharedPreferences("shenwenjian", MODE_WORLD_READABLE);//shenwenjian 为 sharepreferences的名字
    Toast.makeText(this, mSharedPreferences.getString("name", "null"), Toast.LENGTH_SHORT).show();
            
        }
    }注意你创建这个SharedPreferences 时候的权限
      

  19.   

    我也遇到了,但是最好把代码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);写在一个函数里面,因为同楼上说的,要获取同一个类。因为重写onclick这些函数里面往往是不同类。所以获取不到。我遇到的就这种情况
      

  20.   

    我也遇到了这个问题。由于需求是其他应用程序只能读取,因
    此我的做法是在A和B应用中设置mode为:
     MODE_WORLD_READABLE|MODE_MULTI_PROCESS。若只有B设置为 MODE_WORLD_READABLE|MODE_MULTI_PROCESS,
    而A设置为MODE_WORLD_READABLE也是不行的。
    (PS:其实这里我也有点不解,为什么A应用也要设置MODE_MULTI_PROCESS)关于MODE_MULTI_PROCESS:
    在Android 2.3及以前,MODE_MULTI_PROCESS这个标志位都是默认开启的,允许多个进程访问同一个SharedPrecferences对象。而以后的Android版本,必须通过明确的将MODE_MULTI_PROCESS这个值传递给mode参数,才能开启多进程访问。
      

  21.   

    我在A程序里设置了 MODE_WORLD_READABLE,
    B程序里设置了 Context.MODE_WORLD_READABLE|Context.MODE_MULTI_PROCESS
    好使了