文章出处:https://blog.csdn.net/shift_wwx/article/details/9243109
请转载的朋友标明出处~~
详解可以看一下: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的。