当前位置:   article > 正文

Android SharedPreferences使用以及原理详解_android shareprefrence与context的关系

android shareprefrence与context的关系

概述

SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,Stringint等。一般会将复杂类型的数据转换成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,如果存在则打开它,否则创建新的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();


B、读取数据信息


//1、获取Preferences

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

//2、取出数据

String name = settings.getString(“name”,默认值);

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

//以上就是AndroidSharedPreferences的使用方法,其中创建的Preferences文件存放位置可以在Eclipse中查看:

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


Demo

  1. import android.app.Activity;
  2. import android.content.SharedPreferences;
  3. import android.os.Bundle;
  4. public class PermissionActivity extends Activity {
  5. private final int[] MODES=new int[]{
  6. Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
  7. Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
  8. Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
  9. //如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
  10. Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
  11. };
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. for(int i=0;i<MODES.length;i++){
  17. SharedPreferences mySharedPreferences=getSharedPreferences("data_"+String.valueOf(i+1),MODES[i]);
  18. SharedPreferences.Editor editor=mySharedPreferences.edit();
  19. editor.putString("name",String.valueOf(i+1));
  20. editor.commit();
  21. }
  22. }
  23. }


运行机制


Context内部实现


getSharedPreferences()方法本身是Context这个接口中定义的一个抽象方法,由ContextImpl类负责实现。


、调用getSharedPreferences()获取对应的的文件,该函数实现功能如下:

  1. //Context类静态数据集合,以键值对保存了所有读取该xml文件后所形成的数据集合
  2. private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs =
  3. new HashMap<File, SharedPreferencesImpl>();
  4. @Override
  5. public SharedPreferences getSharedPreferences(String name, int mode){
  6. //其所对应的SharedPreferencesImpl对象 ,该对象已一个HashMap集合保存了我们对该文件序列化结果
  7. SharedPreferencesImpl sp;
  8. File f = getSharedPrefsFile(name); //该包下是否存在对应的文件,不存在就新建一个
  9. synchronized (sSharedPrefs) { //是否已经读取过该文件,是就直接返回该SharedPreferences对象
  10. sp = sSharedPrefs.get(f);
  11. if (sp != null && !sp.hasFileChanged()) {
  12. //Log.i(TAG, "Returning existing prefs " + name + ": " + sp);
  13. return sp;
  14. }
  15. }
  16. //以下为序列化该xml文件,同时将数据写到map集合中
  17. Map map = null;
  18. if (f.exists() && f.canRead()) {
  19. try {
  20. str = new FileInputStream(f);
  21. map = XmlUtils.readMapXml(str);
  22. str.close();
  23. }
  24. ...
  25. }
  26. synchronized (sSharedPrefs) {
  27. if (sp != null) {
  28. //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map);
  29. sp.replace(map); //更新数据集合
  30. } else {
  31. sp = sSharedPrefs.get(f);
  32. if (sp == null) {
  33. //新建一个SharedPreferencesImpl对象,并且设置其相关属性
  34. sp = new SharedPreferencesImpl(f, mode, map);
  35. sSharedPrefs.put(f, sp);
  36. }
  37. }
  38. return sp;
  39. }
  40. }


 

 2、 SharedPreferences 不过是个接口,它定义了一些操作xml文件的方法,其真正实现类为SharedPreferencesImpl ,该类是ContextIml的内部类,该类如下:

  1. //soga,这种形式我们在分析Context ContextIml时接触过
  2. //SharedPreferences只是一种接口,其真正实现类是SharedPreferencesImpl类
  3. private static final class SharedPreferencesImpl implements SharedPreferences{
  4. private Map mMap; //保存了该文件序列化结果后的操作, 键值对形式
  5. //通过key值获取对应的value值
  6. public String getString(String key, String defValue) {
  7. synchronized (this) {
  8. String v = (String)mMap.get(key);
  9. return v != null ? v : defValue;
  10. }
  11. }
  12. ...
  13. //获得该SharedPreferencesImpl对象对应的Edito类,对数据进行操作
  14. public final class EditorImpl implements Editor {
  15. private final Map<String, Object> mModified = Maps.newHashMap(); //保存了对键值变化的集合
  16. }
  17. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法研究专家/article/detail/60747
推荐阅读
相关标签
  

闽ICP备14008679号