SharedPreferences简介
SharedPreferences是Android提供的一种存储数据的机制,用于存储少量数据,数据类型包括(boolean 、int、long、float、string),主要用于存储应用的配置信息,例如:用户名、密码、是否开启震动、音乐等。
它实际上是以键值对的形式储存在xml文件中。存储位置:data/data/程序包名/shared_prefs/ 目录下。
保存数据
先看下代码:
SharedPreferences mPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mPreferences.edit();
mEditor.putInt("int", 1);
mEditor.putBoolean("boolean", true);
mEditor.putFloat("float", 3.14f);
mEditor.putLong("long", 123l);
mEditor.putString("string", "abcd");
mEditor.commit();
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
第1行 通过context获取SharedPreferences对象SharedPreferences
第一个参数表示要操作的xml文件名。
第二个参数 操作模式,操作模式如下:Context类中的变量,类型为public static final int。
- MODE_PRIVATE = 0x0000; 0 默认模式,指定该SharedPreferences数据只能被本应用程序读、写。
- MODE_WORLD_READABLE = 0x0001; 1 指定数据可以被其他应用程序读,但不能写。
创建可读的文件是很危险的,而且可能以引起应用程序的安全漏洞。强烈劝阻;相反,应用程序应该使用的互动更加正式的机制 如{ContentProvider},{BroadcastReceiver}和{android.app.Service}。此变量在API级别17中已被弃用。 - MODE_WORLD_WRITEABLE = 0x0002; 2 指定数据可以被其他应用程序写,但不能读。
创建可写文件也是危险的,不推荐使用。此变量在API级别17中已被弃用。 - MODE_MULTI_PROCESS = 0x0004; 4 文件将会在SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用有多个进程的情况。
第2行 获取Editor对象,通过editor对象来更改SharedPreferences中的内容。
第3~7行 设置键值对。
第8行 提交修改。(很重要,如果不执行则并没有更改数据)。
以put开头的是设置键值对的方法。rmove方法用来移除某键值对。
apply() 和commit()都可以用来保存修改。
- commit()有返回值,成功返回true,失败返回false。将内容修改从编辑器提交到SharedPreferences对象,这是原子到执行修改,替换当前在SharedPreferences中的任何内容。注意:当两个编辑器同时修改内容时,最后一个调用提交覆盖之前的更改。如果不关心返回值,并且从应用程序的主线程中使用该值,请考虑使用apply()。return 如果返回true,则表示将新值写入持久存储(硬件磁盘)成功,否则表示写入失败。
- apply()没有返回值,apply()是将修改的数据提交到内存, 而后异步真正的提交到硬件磁盘,不会通知任何失败。
如果SharedPreferences的另一个编辑器editor在apply异步提交伤胃完成时定期进行commit,则commit将阻塞,直到所有异步提交完成。
由于SharedPreferences在一个进程中是单列的,如果忽略了返回值,可以安全的替换任何commit 到apply。
获取数据
代码如下:
int a = mPreferences.getInt("int", 0);
boolean bool = mPreferences.getBoolean("boolean", false);
float f = mPreferences.getFloat("float", 0.0f);
long l = mPreferences.getLong("long", 0);
String s = mPreferences.getString("string", "");
String wifi = mPreferences.getString("wifi", "5566");
监听数据改变
SharedPreferences类中提供了监听数据变化的接口,代码如下
private OnSharedPreferenceChangeListener mListener=
new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.i(TAG, "Changed key="+key);
}
};
//注册监听
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
当SharedPreferences中的数据修改后,会回调mListener中的onSharedPreferenceChanged方法,通过参数key可以知道哪个键值进行了变动。
我们来尝试修改一下:
mEditor.putInt("int", 1);
mEditor.putString("string", "ab");
mEditor.remove("long");
mEditor.commit();
打印如下:
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=string
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=long
由于原先的int键对应的值为1,该值没有改变,所以不会回调onSharedPreferenceChanged。而string键的值由abcd变成了ab,删除了long键,所以这两个键更改都有回调。
取消监听SharedPreference
mPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
以上就是SharedPreferences的简单用法。
总结
1)写入数据:
//步骤1:创建一个SharedPreferences对象
SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
//步骤2: 实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor = sharedPreferences.edit();
//步骤3:将获取过来的值放入文件
editor.putString("name", “Tom”);
editor.putInt("age", 28);
editor.putBoolean("marrid",false);
//步骤4:提交
editor.commit();
2)读取数据:
SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
String userId=sharedPreferences.getString("name","");
3)删除指定数据
editor.remove("name");
editor.commit();
4)清空数据
editor.clear();
editor.commit();
Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;
Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写;
Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读;
Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;