Ⅰ. 一个简短的引论

很多时候我们需要开发软件,为用户提供软件参数设置功能,比如,我们经常使用 QQ。用户可以设置自己是否同意加入一个陌生人为好友。对于软件的配置参数的存储,假设window採用ini文件进行保存,假设是j2se应用,我们会採用properties属性文件或者xml进行保存。假设是Android应用,我们最适合採用什么方式保存软件配置參数呢?Android 平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置參数。

SharedPreferences
类似过去Windows系统上的ini配置文件,可是它分为多种权限。能够全局共享訪问,终于是以xml方式来保存,总体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,假设真的存储量不大能够考虑自定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比方XMLpull方式,这样对于内存资源占用比較好。

使用 SharedPreferences保存数据。其背后是用xml文件存放数据。文件存放在/data/data/<package name>/shared_prefs文件夹下(须要用户的root权限)

SharedPreferences的使用很easy,可以轻松的存放数据和读取数据。SharedPreferences仅仅能保存简单类型的数据,比如。String、int等。通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件里,再用SharedPreferences保存。这种方式应该是用起来最简单的Android读写外部数据的方法了。他的使用方法基本上和 J2SE(java.util.prefs.Preferences)中的使用方法一样,以一种简单、透明的方式来保存一些用户个性化设置的字体、颜色、位置等參数信息。

一般的应用程序都会提供“设置”或者“首选项”的这种界面,那么这些设置最后就行
通过Preferences来保存,而程序猿不须要知道它究竟以什么形式保存的,保存在了什么地方。当然。假设你愿意保存其它的东西,也没有什么限制。仅仅 是在性能上不知道会有什么问题。


Ⅱ. 使用

使用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。假设存在则打开它,否则创建新的Preferences

SharedPreferences settings = getSharedPreferences(“setting”, 0);

//2、让setting处于编辑状态

SharedPreferences.Editor editor = settings.edit();

//3、存放数据

editor.putString(“name”,”ATAAW”);

editor.putString(“URL”,”ATAAW.COM”);

//4、完毕提交

editor.commit();

由于SharedPreferences背后是使用xml文件保存数据。getSharedPreferences(name,mode)方法的第一个參数用于指定该文件的名称,名称不用带后缀,后缀会由Android自己主动加上。

方法的第二个參数指定文件的操作模式,共同拥有四种操作模式。

  • 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//该模式会检查文件是否存在。存在就往文件追加内容。否则就创建新文件

假设希望SharedPreferences背后使用的xml文件能被其它应用读和写,能够指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

另外Activity还提供了还有一个getPreferences(mode)方法操作SharedPreferences。这种方法默认使用当前类不带包名的类名作为文件的名称。


B、读取数据信息

//1、获取Preferences

SharedPreferences settings = getSharedPreferences(“setting”, 0);

//2、取出数据

String name = settings.getString(“name”,”默认值”);//getString()第二个參数为缺省值,假设preference中不存在该key,将返回缺省值

String url = setting.getString(“URL”,”default”);

//以上就是Android中SharedPreferences的用法,当中创建的Preferences文件存放位置能够在Eclipse中查看:

DDMS->File Explorer /<package name>/shared_prefs/setting.xml


执行机制

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的内部类,该类例如以下:

//这样的形式我们在分析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(); //保存了对键值变化的集合
}
}

參考:

http://blog.csdn.net/wxyyxc1992/article/details/17222841

版权声明:本文博主原创文章。博客,未经同意不得转载。

【通过做专题研习Android】知识点:SharedPreferences的更多相关文章

  1. 个人开发者做一款Android App需要知道的事情

    个人开发者做一款Android App需要知道的事情 在大学时, 自己是学计算机专业的,而且还和老师一起做过一年半的项目. 有时候是不是有这样的想法,做一个自己的网站.但一直未付诸行动.2012年时, ...

  2. android中sharedPreferences的用法

    SharedPreferences介绍:   做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...

  3. Android中SharedPreferences和序列化结合保存对象数据

    前言: 最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页 ...

  4. android中sharedPreferences的用法(转)

    SharedPreferences介绍:   做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...

  5. android知识点duplicateParentState

    android知识点duplicateParentState 今天要做一个效果,组件RelativeLayout上有两个TextView,这两个TextView具有不同的颜色值,现在要的效果是,当Re ...

  6. Android之SharedPreferences数据存储

    一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...

  7. 招聘:有兴趣做一个与Android对等的操作系统么?

    招聘:有兴趣做一个与Android对等的操作系统么? 前不久我发了一篇<八一八招聘的那些事儿>讲了我自己作为求职者对招聘的一些看法.那个时候我还在求职,对求职的结果还是挺满意的,五家公司面 ...

  8. android.content.SharedPreferences.edit()

    今天在实现一个保存用户设置到SharedPreferences时,出现了一个不能将数据保存到SharedPreferences中的情况.经过仔细的分析得出: android.content.Share ...

  9. 18.Android之SharedPreferences数据存储学习

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

随机推荐

  1. nyoj 47 江 河问题 【贪婪】

    经典的贪婪. 两种方案:一个:让我们来最快,第二快,在过去的第一,最快的回.然后最慢,最慢第二,在过去.次最快的回来a[0]+a[1]+a[1]+a[n-1] 二:最快的和最慢的过去,最快的回来,最快 ...

  2. 栈实现java

    栈是一种“先去后出”的抽象的数据结构.例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先 ...

  3. 玩转html5(二)----用canvas结合脚本在画布上画简单的图(html5又一强大功能)

    在html5中可以使用canvas标签在画布上画图,先直接上代码,这篇文章先简单介绍一下canvas的使用方法,简单画几个圆,矩形,三角形,写字. 在代码中均给出了注释,在这里特别强调的一点是:使用c ...

  4. VS2012 添加服务引用常见错误

    问题:用vs2012 添加wcf引用时在对象查看器中找不到 服务引用的类 例如默认高级配置: 解决办法:在服务的高级配置中,将重新使用引用的程序集中的类型 选项勾去掉 点击确定  即可

  5. 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23698511 今天继续对我们的csdn客户端未完成的功能进行实现,本篇博客接着客 ...

  6. spring 配置属性的详细信息

    摘要(这篇文章讲的红,蓝说这话节) 字面值 字面值:可用字符串表示的值,能够通过<value>元素标签或value属性进行注入 基本数据类型及其封装类.String等类型都能够採取字面值注 ...

  7. std::string 不支持back

    string  s = "abc"; if ( s.back() == 'c' ) .... , 不支持back, 但是用VS2010好吧 后来发现, string的back/fr ...

  8. VB高清图标制作方法

    我隆重介绍一个软件:ResHacker !!! 这个软件可以修改软件的很多东西包括图标和标题,下面看**作. 运行ResHacker打开要更改图标的exe文件, 图标组--1--右键0--替换资源-- ...

  9. 创建Material Design风格的Android应用--使用Drawable

    下面Drawables的功能帮助你在应用中实现Material Design: 图片资源着色 在android 5.0(api 21)和更高版本号,能够着色bitmap和.9 png 通过定义透明度遮 ...

  10. SELECT 场 FROM 表 WHERE 字段 Like 条件

    间有关的条件,SQL它提供了四种匹配模式: 1.%: 表示随意0个或多个字符.可匹配随意类型和长度的字符.有些情况下若是中文,请使用两个百分号(%%)表示. 比方 SELECT * FROM [use ...