前言

在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等。但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成SharedPreferences泛滥,不好管理,代码可维护性差。因此结合实际的项目经验给出一个通用的SharedPreferences管理类,把项目中所有使用到的SharedPreferences统一管理,同时简化SharedPreferences的使用流程。

SharedPreferences简介

1、原理 SharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式,并且是使用键值对的方式来存储数据的。对于一个Android应用,它存贮在文件系统的/data/data/app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity 访问。 因为SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的

getSharedPreferences(String name,int mode)
复制代码

方法来获取SharedPreferences的实例:

public abstract SharedPreferences getSharedPreferences(String name,int mode)
复制代码

此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个。第二个参数用于指定操作模式: MODE_PRIVATE:默认操作模式,和直接传0效果相同,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写 MODE_WORLD_READABLE:指定此SharedPreferences对其他程序只读且无法修改。 MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序读写。

2、实例

SharedPreferences 的使用也很简单,主要分为三步,1、获取SharedPreferences 的实例2、通过Editor 往SharedPreferences 中存数据。3、获取SharedPreferences 中的数据。

//1
private SharedPreferences sp=context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);
//获取SharedPreferences实例//2Editor editor = sp.edit();editor.putString("msg", "hello world");editor.commit();
//通过editor存储数据//3sp.getString("msg", "");
//获取存储的数据
复制代码

SharedPreferences管理类实现

由上面SharedPreferences的用法可知,每一个SharedPreferences都有一个名字,SharedPreferences里面存的内容是通过key-value形式的。要把项目中所有的SharedPreferences管理起来,又可以通过名字获取相应的SharedPreferences,可以通过HashMap作为数据结构来存储SharedPreferences。如下图:

但是如果在HashMap中只存储SharedPreferences那么获取到SharedPreferences后又要进行各种读写操作,所以可以考虑把这些操作和SharedPreferences封装在一起放到hashMap中保存。如下图:

使用HashMap来存储项目中用到的所有SharedPreferences的封装类,并且通过SharedPreferences的名称来查找和操作。 定义一个SharedPreferencesManager类。 1、类变量

public class SharedPreferencesManager {private static final String DEFAULT_SHARED_PREFERENCE = "DEFAULT_SHARED_PREFERENCE";//默认名称private static HashMap<String, SharedPreferencesManager> preferenceManagerHashMap = new HashMap<>();//存储项目中的SharedPreferences。private SharedPreferences sharedPreference;private SharedPreferences.Editor editor;//和当前SharedPreferences相关,用于操作SharedPreferences数据......
}
复制代码

在SharedPreferencesManager中定义了DEFAULT_SHARED_PREFERENCE用于表示未命名的默认的SharedPreferences,preferenceManagerHashMap 用来存储项目中使用到的SharedPreferences封装类SharedPreferencesManager,并且可以通过SharedPreferences名字查找到。

2、生成SharedPreferences封装类SharedPreferencesManager并存到HashMap中

    private static SharedPreferencesManager getSharedPreferenceManager(Context context, String sharedPreferenceName) {if (preferenceManagerHashMap == null) preferenceManagerHashMap = new HashMap<>();// 如果preferenceManagerHashMap 为null就新建一个String name = TextUtils.isEmpty(sharedPreferenceName) ? DEFAULT_SHARED_PREFERENCE : sharedPreferenceName;SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null) {sharedPreferencesManager = new SharedPreferencesManager(context, name);preferenceManagerHashMap.put(name, sharedPreferencesManager);}return sharedPreferencesManager;}
复制代码

getSharedPreferenceManager中通过判断当前name是否存在对应的sharedPreferencesManager如果没有就生成一个sharedPreferencesManager并且存放到preferenceManagerHashMap中。

3、sharedPreferencesManager的构造函数

    private SharedPreferencesManager(Context context, String name) {sharedPreference = context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);//获取sharedPreference editor = sharedPreference.edit();//生成editor       }
复制代码

在sharedPreferencesManager的构造函数中生成了sharedPreference和editor用于操作数据。

4、存放数据和读取数据 存放数据,通过构造方法里面生成的editor来进行数据的存放,putValue里面做了类型判断。

 public SharedPreferencesManager putValue(String key, Object value) {if (value instanceof Integer) {editor.putInt(key, (Integer) value);} else if (value instanceof Boolean) {editor.putBoolean(key, (Boolean) value);} else if (value instanceof Float) {editor.putFloat(key, (Float) value);} else if (value instanceof String) {editor.putString(key, (String) value);} else if (value instanceof Long) {editor.putLong(key, (Long) value);} else {String json = gson.toJson(value);editor.putString(key, json);}editor.commit();return this;}
复制代码

读取数据

 public <T> T getValue(String key, Class<T> type) {if (type == Integer.class) {Integer value = sharedPreference.getInt(key, 0);return (T) value;} else if (type == Boolean.class) {Boolean value = sharedPreference.getBoolean(key, false);return (T) value;} else if (type == Float.class) {Float value = sharedPreference.getFloat(key, 0);return (T) value;} else if (type == String.class) {String value = sharedPreference.getString(key, "");return (T) value;} else if (type == Long.class) {Long value = sharedPreference.getLong(key, 0);return (T) value;} else {String json = sharedPreference.getString(key, "");if (TextUtils.isEmpty(json)) {return null;} else {T value = gson.fromJson(json, type);return value;}}}
复制代码

5、SharedPreferencesManager初始化

前面已经定义了方法数据和读取数据的方法,下面给SharedPreferencesManager初始化,初始化一次生成项目中要用到的所有SharedPreferences实例。

    public static synchronized void init(Context context, boolean createDefaultPreference, String... names) {if (createDefaultPreference) {getSharedPreferenceManager(context, DEFAULT_SHARED_PREFERENCE);}if (names == null || names.length == 0) return;for (String name : names) {getSharedPreferenceManager(context, name);}}
复制代码

createDefaultPreference表示是否生成默认的SharedPreference,names表示项目中要生成的SharedPreferences的名称。 6、获取SharedPreferencesManager实例 使用单例模式来生成SharedPreferencesManager的实例

//根据name返回实例
public static synchronized SharedPreferencesManager getInstance(String name) {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null)throw new IllegalStateException("The share preference: " + name + " is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function");return sharedPreferencesManager;}/*** 返回默认的SharedPreferencesManager 实例: {@link #DEFAULT_SHARED_PREFERENCE}** @return*/public static synchronized SharedPreferencesManager getInstance() {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(DEFAULT_SHARED_PREFERENCE);if (sharedPreferencesManager == null)throw new IllegalStateException("The default share preference is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function");return sharedPreferencesManager;}
复制代码

总结

有了SharedPreferencesManager类之后,就可以在项目中先使用init()方法初始化所有的SharedPreferences,然后调用实例,就可以直接简单的操作了。源码地址:源码地址

Android自己搭建一个实用的SharedPreferences管理类相关推荐

  1. DEVONthink + Notion 搭建一个完美的知识管理体系

    时至今日,互联网的分享难度大大降低,有道云笔记.Evernote.OneNote.为知笔记等笔记应用次第兴起,也带来了丰富的方式来保存你所感兴趣的内容,当然也不得不提后起之秀 Notion 和主打本地 ...

  2. Qt重定向QDebug,自定义一个简易的日志管理类

    0.前言 相对于第三方的日志库,在 Qt 中使用 QDebug 打印更便捷,有时候也需要对 QDebug 输出进行重定向,如写入文件等. 在 Qt4 中使用 qInstallMsgHandler 函数 ...

  3. 超详细教程:Android Studio搭建一个与百度AI识别接口连接的Activity,用来识别植物

    最近做了一个小项目,想要搭建一个能够进行图像识别的安卓APP,一路上也碰了不少坑,就在这里写一篇博客,希望萌新们也少踩坑里,也值得我以后再回来看看复习一下. 1.声明权限 <uses-permi ...

  4. Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)

    上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页 了解了LigerUI 中Grid的基本用法  现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面. ...

  5. Android Okhttp3 (二) 二次封装请求管理类

    okHttp介绍 通过上面的对比说明,让你不得不做出明智的选择,OkHttp是一个相对成 官网地址:http://square.github.io/okhttp/ 官方API地址:http://m.b ...

  6. Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(含登录验证)

    1.打开VS新建一个MVC项目,右键点击项目新建一个区域Admin作为后台部分 2.既然要做登录限制我们在App_Start下面新建一个类 继承Controller作为基处理控制器. 里面Sessio ...

  7. Flink从入门到精通100篇(七)-如何基于 Flink 搭建一个实用有效的在线实时反欺诈平台?

    前言 在大数据时代,金融科技公司通常借助消费数据来综合评估用户的信用和还款能力.这个过程中,某些中介机构会搜集大量的号并进行"养号"工作,即在一年周期里让这些号形成正常的消费.通讯 ...

  8. 一个实用的String实现类(C++)

    2019独角兽企业重金招聘Python工程师标准>>> /************************************************* CString Clas ...

  9. 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...

最新文章

  1. 嵌入式移植NTP(Network Time Protocol)
  2. poj 1006(中国剩余定理)
  3. PHP的静态方法与普通方法
  4. 进程wait()与waitpid()
  5. Git使用教程:真正手把手教你使用git!
  6. eclipse中如何配置tomcat
  7. check-lxdialog.sh: line 3: $'\r': command not found
  8. Pure Pursuit纯跟踪算法Python/Matlab算法实现
  9. MYSQL中的空格及大小写问题
  10. java获取局域网内主机,java怎么获取局域网内所有主机ip
  11. Android 文件系统路径
  12. Django 分页 以及自定义分页
  13. c#二叉树 取叶子节点个数_图文并茂方式轻松掌握数据结构之二叉树和B树!
  14. 微信小程序开发的基本流程
  15. matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
  16. php十六进制转二进制,php 十六进制转化为二进制的代码
  17. CM9和AOKP的区别
  18. matlab 平行四边形,matlab计算四边形面积
  19. php ic卡,IC卡的数据结构认识
  20. 互联网创业必备工具盘点

热门文章

  1. 华为交换机配置Telnet步骤
  2. javascript--弹出对话框 四种对话框 获得用户输入值 .
  3. Select的OnChange()事件中获取选中的值
  4. 2011-07-04 22:11 Jfreechart生成曲线图数据点显示数据值
  5. java stringbuffer倒置_Java程序设计05——String和StringBuffer
  6. 如何对计算属性进行修改_「计算摄影」计算机如何学会自动地进行图像美学增强?...
  7. PHP页面运行一半,在PHP中仅缓存页面的一部分
  8. mysql 36条军规_mysql开发36条军规(转)
  9. 两路虚拟化服务器,当四核多路服务器碰上虚拟化
  10. python华为面试题10个人数3获取下标