说明:
1.SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,
将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。
2.严格来说,SharedPreferences最好不要用来保存“用户配置”,比如,用户选择了什么铃声,是否自动更新等等。如果要为应用创建用户配置,
可以使用PreferenceActivity,它可以用来创建“用户配置”。(PreferenceActivity用来创建程序中的设置界面)
3.SharedPreferences保存的数据最好是基础数据类型(当然也可以用来保存用户配置,官方推荐PreferenceActivtiy )。
原理:以XML的结构保存在手机的/data/data/包名/shared_prefs文件夹下,数据以键值对(Map)的形式保存。例如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map><float name="isFloat" value="1.5" /><string name="isString">Android</string><int name="age" value="11" /><boolean name="boolean" value="true" /><set name="isStringSet"><string>element 1</string><string>element 2</string></set>
</map>
注意:SharedPreferences 只适合做轻量级的存储的,不适合大量数据存储的原因:
1.在UI线程中调用getXXX可能会导致ANR
2.在获取初始化SharePreferences 对象时会加载对应的xml文件的所有数据到内存中,若xml文件很大,占用内存就大,当想读取xml文件某一个key的值,但在我们获取的时候回加载整个文件
3.每次添加键值对都会重新写入整个文件的数据,而不是增量写入。
commit和apply:
1.apply没有返回值,而commint有返回值(boolean)
2.commint是同步把数据存放到硬盘,所以效率慢;apply是先保存到内存中,再开一个异步的线程保存到硬盘,不管成功否我们都不知道,所以速度快
3.apply是使用异步线程写入磁盘,commit是同步写入磁盘,在主线程使用的commit的时候,需考虑是否会出现ANR问题。
使用方法:
//保存数据public void save(){/**参数 1 为存放的文件名称,没有则创建;参数 2 为保存的形式:Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写,在Android N抛出SecurityException异常;Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,在Android N抛出SecurityException异常;Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用*/SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);SharedPreferences.Editor editor=sp.edit();//以键值对形式存储:参 1 为 key, 参 2 为valueeditor.putString("name","小明");editor.putString("password","123");//提交 返回值是booleaneditor.commit();}//获取key的值public void gain(){//同上, 但参数 1 一定要和保存时的文件名一致SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data",Context.MODE_PRIVATE);//参数 1 是 保存时的 key值 ,参数 2 是 当不存在这个key时,默认这个key的值等于 参数 2String name=sp.getString("name",null);String password=sp.getString("password",null);}//清除某个key 的值public void remove(){SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data",Context.MODE_PRIVATE);SharedPreferences.Editor editor=sp.edit();editor.remove("name");editor.commit();}//清空整个文件内容public void clean(){SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);SharedPreferences.Editor editor=sp.edit();editor.clear();editor.commit();}//是否存在某个keypublic void isHaveKey(){SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);boolean b=sp.contains("name");}//获取所有keypublic void getAllKey(){SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);Map<String,?> map=sp.getAll();}