首先我们来介绍一下SharedPreferences这个接口的作用:

我们都知道,很多时候我们对于系统依赖的一些参数设置总是会放到一个配置文件中,例如在java中我们通常会用到*.properties文件;在android中,我们也有类似于*.properties的一类文件,而这类文件在android中的对象表现形式,就是SharedPreferences。你可以认为,每个应用中使用的SharedPreferences是该应用文件的一个映射。

现在,我们知道了,sharedPreferences接口可以让我们存储一些值。

在SharedPreferences的api说明中,我们可以看到这样一段介绍。

[c-sharp:nogutter] view plain copy
  1. InterfaceforaccessingandmodifyingpreferencedatareturnedbygetSharedPreferences(String,int).Foranyparticularsetofpreferences,thereisasingleinstanceofthisclassthatallclientsshare.ModificationstothepreferencesmustgothroughanSharedPreferences.Editorobjecttoensurethepreferencevaluesremaininaconsistentstateandcontrolwhentheyarecommittedtostorage.
  2. Note:currentlythisclassdoesnotsupportuseacrossmultipleprocesses.Thiswillbeaddedlater.

翻译如下:

SharedPreferences接口一般用来访问或修改由方法getSharedPreferences(String,int)返回的设置信息。这里的设置信息都是单例唯一的,这就意味着改设置信息会被所以安装了该APK应用的客户端(手机)所共享。如果我们要想修改这些设置信息,我们则必须要通过SharedPreferences.Editor对象进行修改,至于为什么一定要获取这个Editor对象之后才可以修改呢,原因是这样的,我们前面已经说了,改配置信息会被所有的客户端共享,那就意味着同一时刻可能有好几个客户端要对配置信息中的值进行修改,这很容易出现数据修改混乱的问题,这里通过获取SharedPreferences.Editor对象就是为了保证数据的一致性。注意,到目前为止,SharedPreferences是不支持多进程的,该功能处于待添加状态。

我们再来看看,该接口中主要的方法有哪些:

SharedPreferences包含两个内部类,SharedPreferences.Editor和SharedPreferences.OnSharedPreferencesChangeListener;其中Editor主要在对属性设置进行修改时使用,而OnSharedPreferencesChangeListener则是在属性被修改时触发的一个事件,我们可以在里面做一些额外的动作,如根据新的属性值去触发一些页面的改变了,等等……

至于其他的方法,都很简单,一看方法名就知道啥意思了,我就不详细介绍了。现在给大家贴一个应用的例子:

先上图:

然后是main.xml

[xhtml:collapse] + expand source view plain copy

activity的代码:

[java] view plain copy
  1. packagecn.com.sharedPreferencesTest;
  2. importandroid.app.Activity;
  3. importandroid.content.SharedPreferences;
  4. importandroid.os.Bundle;
  5. importandroid.util.Log;
  6. importandroid.widget.TextView;
  7. publicclassSharedPreferencesActivityextendsActivity{
  8. @Override
  9. publicvoidonCreate(BundlesavedInstanceState){
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. saveSharedPreferences();
  13. readSharedPreferences();
  14. }
  15. /**
  16. *@authorchenzheng_java
  17. *@description创建并保存一些设置信息
  18. *@since2011/03/05
  19. */
  20. privatevoidsaveSharedPreferences(){
  21. /*
  22. *getSharedPreferences(Stringname,intmode)方法是在Context中定义的抽象方法,在ContextWrapper中进行了具体实现,
  23. *该方法会根据用户传递的名称和写入类型创建一个SharedPreferences对象进行返回。
  24. *在Activity中,还有一个方法可以回去SharedPreferences对象,这个方法就是SharedPreferencessharedPreferences=getPreferences(MODE_PRIVATE);
  25. *改方法在Activity中定义并实现,这里没有name参数是因为该方法默认将当前Activity的类名作为name属性(这里的类名并不包含包路径哦)
  26. **/
  27. SharedPreferencessharedPreferences=getSharedPreferences("preferences",MODE_PRIVATE);
  28. //存储数据
  29. SharedPreferences.Editoreditor=sharedPreferences.edit();
  30. editor.putString("name","蔡依林");
  31. editor.putInt("age",31);
  32. Booleanb=editor.commit();
  33. if(b){
  34. Log.i("通知:","保存成功!");
  35. }else{
  36. Log.i("通知","保存失败!");
  37. }
  38. }
  39. /**
  40. *@authorchenzheng_java
  41. *@description读取我们添加到SharedPreference对象中的数据
  42. *@since2011/03/05
  43. */
  44. privatevoidreadSharedPreferences(){
  45. Stringresult="美女信息:/n";
  46. SharedPreferencessharedPreferences=this.getSharedPreferences("preferences",MODE_PRIVATE);
  47. result+="姓名"+sharedPreferences.getString("name","暂时没有人");
  48. result+="年龄"+sharedPreferences.getInt("age",-1);
  49. TextViewtextView=(TextView)findViewById(R.id.textView);
  50. textView.setText(result);
  51. }
  52. }

其他的都为默认。

---------------------------------------------------------------------

最后了,说点废话

SharedPreferences实际上是按照键值对的方式进行数据存储的,如果同一个key被设置了两次值,那么后来的值将会覆盖掉前面的值。实际上,SharedPreferences在后台是使用XML文件的格式进行存储数据的,其存储的目录为/data/data/应用包名称/shared_prefs。

如:

[xhtml] view plain copy
  1. <?xmlversion='1.0'encoding='utf-8'standalone='yes'?>
  2. <map>
  3. <intname="age"value="31"/>
  4. <stringname="name">蔡依林</string>
  5. </map>

而且SharedPreferences对象对于存储值的格式是有严格要求的,从方法中我们可以看到,只能存储String/int/long/Float/Boolean几种类型的数据。

------------------------------------------------------------------------------------

小技巧:如果我们在当前的activity中想访问另一个activity(如cn.com.abc.activityTest)的SharedPreferences对象,我们应该如何获取呢?

应该如下获取

[java] view plain copy
  1. //获取包含cn.com.abc.activityTest的那个context对象,然后通过context对象来获取,注意这里的mode必须为Context.MODE_WORLD_READABLE
  2. ContextotherAppContext=createPackageContext("cn.com.abc.activityTest",Context.CONTEXT_IGNORE_SECURITY);
  3. SharedPreferencessharedPreferences=otherAppContext.getSharedPreferences("preferences",Context.MODE_WORLD_READABLE);

--------------------------------------------------------------

最后粘贴上SharedPreferences的源码,方便查阅。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 类和 Json对象
  3. Python list sort方法的具体使用
  4. python list.sort()根据多个关键字排序的方法实现
  5. android上一些方法的区别和用法的注意事项
  6. android实现字体闪烁动画的方法
  7. android Dialog大小修改
  8. Android中dispatchDraw分析
  9. Android四大基本组件介绍与生命周期

随机推荐

  1. Android(安卓)防止按钮重复点击
  2. Android源码中常用的系统广播
  3. Android提高十七篇之多级树形菜单的实现[
  4. Adapter 中getView使用注意点
  5. android 屏幕触摸事件的分发与处理
  6. 【读书笔记-《Android游戏编程之从零开始
  7. Android调用相机拍摄照片并显示到 ImageV
  8. 推送2
  9. Android自定义气球Overlay的开发
  10. Android的handler和callback机制