SharedPreference 实现不同进程间的数据共享
文章出处: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button save = (Button)findViewById(R.id.save);save.setOnClickListener(new OnClickListener() {@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button get = (Button)findViewById(R.id.get);get.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {getSharedPreference();}});Button set = (Button)findViewById(R.id.set);set.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {setSharedPreference();}});}private void getSharedPreference(){try {mContext = createPackageContext("com.shift.sharepreferencea", CONTEXT_IGNORE_SECURITY);} catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.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的。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
