Android SharedPreferences使用以及原理详解
2013-12-09 14:40
429 查看
概述
SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。使用SharedPreferences保存key-value对的步骤如下:
(1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定。
(2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。
(3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。
(4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。
使用步骤
具体代码的书写流程为:A、存放数据信息
//1、打开Preferences,名称为setting,如果存在则打开它,否则创建新的PreferencesSharedPreferences settings = getSharedPreferences(“setting”, 0);
//2、让setting处于编辑状态
SharedPreferences.Editor editor = settings.edit();
//3、存放数据
editor.putString(“name”,”ATAAW”);
editor.putString(“URL”,”ATAAW.COM”);
//4、完成提交
editor.commit();
B、读取数据信息
//1、获取PreferencesSharedPreferences settings = getSharedPreferences(“setting”, 0);
//2、取出数据
String name = settings.getString(“name”,”默认值”);
String url = setting.getString(“URL”,”default”);
//以上就是Android中SharedPreferences的使用方法,其中创建的Preferences文件存放位置可以在Eclipse中查看:
DDMS->File Explorer /<package name>/shared_prefs/setting.xml
Demo
import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; public class PermissionActivity extends Activity { private final int[] MODES=new int[]{ Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取, Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入; //如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件 }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); for(int i=0;i<MODES.length;i++){ SharedPreferences mySharedPreferences=getSharedPreferences("data_"+String.valueOf(i+1),MODES[i]); SharedPreferences.Editor editor=mySharedPreferences.edit(); editor.putString("name",String.valueOf(i+1)); editor.commit(); } } }
运行机制
Context内部实现
getSharedPreferences()方法本身是Context这个接口中定义的一个抽象方法,由ContextImpl类负责实现。1 、调用getSharedPreferences()获取对应的的文件,该函数实现功能如下:
//Context类静态数据集合,以键值对保存了所有读取该xml文件后所形成的数据集合 private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs = new HashMap<File, SharedPreferencesImpl>(); @Override public SharedPreferences getSharedPreferences(String name, int mode){ //其所对应的SharedPreferencesImpl对象 ,该对象已一个HashMap集合保存了我们对该文件序列化结果 SharedPreferencesImpl sp; File f = getSharedPrefsFile(name); //该包下是否存在对应的文件,不存在就新建一个 synchronized (sSharedPrefs) { //是否已经读取过该文件,是就直接返回该SharedPreferences对象 sp = sSharedPrefs.get(f); if (sp != null && !sp.hasFileChanged()) { //Log.i(TAG, "Returning existing prefs " + name + ": " + sp); return sp; } } //以下为序列化该xml文件,同时将数据写到map集合中 Map map = null; if (f.exists() && f.canRead()) { try { str = new FileInputStream(f); map = XmlUtils.readMapXml(str); str.close(); } ... } synchronized (sSharedPrefs) { if (sp != null) { //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map); sp.replace(map); //更新数据集合 } else { sp = sSharedPrefs.get(f); if (sp == null) { //新建一个SharedPreferencesImpl对象,并且设置其相关属性 sp = new SharedPreferencesImpl(f, mode, map); sSharedPrefs.put(f, sp); } } return sp; } }
2、 SharedPreferences 不过是个接口,它定义了一些操作xml文件的方法,其真正实现类为SharedPreferencesImpl ,该类是ContextIml的内部类,该类如下:
//soga,这种形式我们在分析Context ContextIml时接触过 //SharedPreferences只是一种接口,其真正实现类是SharedPreferencesImpl类 private static final class SharedPreferencesImpl implements SharedPreferences{ private Map mMap; //保存了该文件序列化结果后的操作, 键值对形式 //通过key值获取对应的value值 public String getString(String key, String defValue) { synchronized (this) { String v = (String)mMap.get(key); return v != null ? v : defValue; } } ... //获得该SharedPreferencesImpl对象对应的Edito类,对数据进行操作 public final class EditorImpl implements Editor { private final Map<String, Object> mModified = Maps.newHashMap(); //保存了对键值变化的集合 } }
相关文章推荐
- Android中Bitmap和Drawable
- SimpleOnGestureListener//简单手势监听
- android开发 drawable(hdpi,mdpi,ldpi)的区别
- 【Android 错误记录】installation error: INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误
- android sqlite select count
- Android jni编译时 Android.mk文件 规范说明
- 【Android & iOS】应用升级实现
- android sqlite 数据类型
- Android屏幕适配解析
- Android 侧滑(双向滑动菜单)效果
- android ListView的小知识点
- Android获取手机的当前时间和获取时间的各种不同的格式
- android 编译找不到符号
- 定制Android模拟器skin
- MotionEvent//动作事件
- 【Android 错误记录】android.os.NetworkOnMainThreadException 异常问题
- 关于android项目的习惯
- android ndk 编译ffmpeg源码(静态库)
- android NDK编译(导入).a文件和编译多个so文件
- android .apk安装时遇到NSTALL_FAILED_CONTAINER_ERROR错误