您的位置:首页 > Web前端

SharedPreference 实现不同进程间的数据共享

2013-07-04 14:53 323 查看
文章出处:http://blog.csdn.net/shift_wwx

请转载的朋友标明出处~~

详解可以看一下:SharedPreferences 详解

sharedpreference大家肯定很熟悉,一般用于数据的存储。

如下:

private void getSharedPreference(){
SharedPreferences mShare = getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE);
mShare.getString("key", "default");
}

private void setSharedPreference(){
SharedPreferences mShare = getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE);
Editor mEditor = mShare.edit();
mEditor.putString("key", "hehe");
mEditor.commit();
}


那么不同的进程是否可以共享一个sharepreference的xml呢?

下面做了两个简单的apk。

Activity A:

public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private SharedPreferences mPreferences;
private static final String SHARED_NAME = "test_share";
private static final int SHARED_MODE = Context.MODE_PRIVATE;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button save = (Button)findViewById(R.id.save);
save.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
setSharedPreference();
}
});
}

private void setSharedPreference(){
Log.d(TAG, "======setSharedPreference=======");
mPreferences = getSharedPreferences(SHARED_NAME, SHARED_MODE);
Editor mEditor = mPreferences.edit();
mEditor.putString("key", "12345");
mEditor.commit();
}
}

Activity B:

public class MainActivity extends Activity {
private static final String TAG = "B";
Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button get = (Button)findViewById(R.id.get);
get.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
getSharedPreference();
}
});

Button set = (Button)findViewById(R.id.set);
set.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
setSharedPreference();
}
});
}

private void getSharedPreference(){
try {
mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_READABLE);
Log.d(TAG, "======"+mShare.getString("key", "error"));
}

private void setSharedPreference(){
try {
mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_WRITEABLE);
Editor mEditor = mShare.edit();
mEditor.putString("key", "hehe");
mEditor.commit();
}

}

虽然通过以下code能获取到对应的对象,但是a中的mode设置的为Context.MODE_PRIVATE

会提示一个错误:Couldn't rename file /data/data/....PREFERENCES_NAME.XML to /data/data/....PREFERENCES_NAME.XML.bak

try {
mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences mShare = mContext.getSharedPreferences("test_share", Context.MODE_WORLD_READABLE);

但是是否改成Context.MODE_WORLD_WRITEABLE或者是Context.MODE_WORLD_READABLE就可以了呢?

答案是不行,所以这一步是走不通的。

 

经过研究发现只要将android:sharedUserId="com.shift.test"两个进程设置为一样的就可以了,而且mode设为任何一个都是ok的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: