很多时候,我们在应用程序开发过程中常常会需要保存一些少量的数据,而且格式也不复杂,都是些简单的字符串、布尔值、简单集合等,比如说应用程序的配置信息、游戏中玩家的积分等,正是基于此SharedPreferences应运而生。
SharedPreferences是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的 getSharedPreferences(String, int)来获取对应的实例,它主要负责读取应用程序Preferences数据,而SharedPreferences自身并没有直接操作数据的能力而是通过调用edit()方法来先得到SharedPreferences.Editor对象,进而实现对数据的编辑和删除,再由系统封装成键值对的xml文件保存在../data/data/app packagename/shared_prefs/xxx.xml。并且对于任何特定设置的首选项,所有的客户端共享的单个实例。修改首选项必须经过一个SharedPreferences.Editor对象,以确保优先值保持一致的状态和控制。
public interface SharedPreferences {
public interface OnSharedPreferenceChangeListener {
void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
}
public interface Editor {
Editor putString(String key, @Nullable String value);
Editor putStringSet(String key, @Nullable Set<String> values);
Editor putInt(String key, int value);
Editor putLong(String key, long value);
Editor putFloat(String key, float value);
Editor putBoolean(String key, boolean value);
Editor remove(String key);
Editor clear();
boolean commit();
void apply();
}
Map<String, ?> getAll();//获取所有的键值对
@Nullable
String getString(String key, @Nullable String defValue);
@Nullable
Set<String> getStringSet(String key, @Nullable Set<String> defValues);//获取set
int getInt(String key, int defValue);
long getLong(String key, long defValue);
float getFloat(String key, float defValue);
boolean getBoolean(String key, boolean defValue);//获取存储的布尔值
boolean contains(String key);//检查是否包含指定key
Editor edit();//返回Editor对象
void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);//onChange监听注册
void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);//取消OnChange监听
}
创建SharedPreferences实例分为两种情况:第一种创建当前应用的,只能通过Context的getSharedPreferences(String name, int mode);第二种创建其他应用的,这两种都是需要调用同一方法,其中第二个参数mode为参数,有四种取值
直接使用当前的上下文Context对象来调用getSharedPreferences
SharedPreferences sharedPreferences=getSharedPreferences("filename",MODE_PRIVATE);
与创建自身的实例不同的是,我们需要先得到第三方应用的上下文对象,再去调用。
Context context=createPackageContext("packgename",CONTEXT_IGNORE_SECURITY);
sharedPreferences=context.getSharedPreferences("filename",MODE_WORLD_WRITEABLE);
上面已经讲过SharedPreferences的实例是不能直接管理操作数据的,一切数据操作都是要由SharedPreferences.Editor来完成,所以管理SharedPreferences需要三步。
SharedPreferences.Editor editor=sharedPreferences.edit();
值得注意的是Editor并没有提供对应的update名称的方法,因为当我们put操作的时候,他会自动帮我们判断,如果没有这个key则新建键值对,如果已经存在则覆盖旧值。
执行了一系列操作后,要想保存操作的结果一定不要忘了commit,有点像数据库的事务操作。
editor.commit();//提交修改
这个SharedPreferences的设计机制真的蛮有意思,访问和操作使用的不是同一个对象,操作借助SharedPreferences.Editor,而访问则是使用SharedPreferences实例来调用相关方法,所以只要我们获取到相应的SharedPreferences实例即可。
public class MainActivity extends Activity {
private SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void readPrefs(View v ){
if (sharedPreferences!=null){
int no=sharedPreferences.getInt("no",-1);
String name=sharedPreferences.getString("name", "cmo");
Toast.makeText(MainActivity.this,no+name,Toast.LENGTH_LONG).show();
}
}
public void writePrefs(View v){
sharedPreferences=getSharedPreferences(getPackageName()+"prefs",MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putInt("no",99);
editor.putString("name", "CrazyMO");
editor.commit();
}
}