创建
- getPreferences(int mode),属于Activity私有的文件,一个Activity只有一个
- getSharedPreferences(String name,int mode),以name来区分不同的文件,可以有多个
- getDefaultSharedPreferences(Context context),属于应用,只有一个
保存
public static final String PREFER_NAME = "TestPreference";
// 该权限在4.0的版本中已经声明弃用了,不再建议通过该方式跨应用共享数据
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
SharedPreferences preferences = getSharedPreferences(PREFER_NAME, MODE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "value");
editor.commit();
使用
- 同应用中
SharedPreferences preferences = getSharedPreferences(PREFER_NAME, MODE);
if (preferences.contains("key")) {
preferences.getString("key", "null");
}
- 不同应用间
Context otherAppContext;
try {
otherAppContext = createPackageContext(otherPackageName,Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
SharedPreferences preferences = otherAppContext.getSharedPreferences(PREFER_NAME, MODE);
preferences.getString("key", "null");
但是在实际程序中发现,跨应用的写操作是无法成功的,会提示一个错误:Couldn’t rename file /data/data/….TestSavePreference.XML to /data/data/….TestSavePreference.XML.bak。可以在manifest.xml里面将两个应用程序的android:sharedUserId属性设为相同的就可以了,同时只需要Context.MODE_PRIVATE也可以完成读写操作。但是最好能避免不安全的方式,采用ContentProvider, BroadcastReceiver, Service 等方式实现跨应用的数据共享。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="com.test.sample" >
</manifest>