Android自己搭建一个实用的SharedPreferences管理类
前言
在项目中经常会用到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管理类相关推荐
- DEVONthink + Notion 搭建一个完美的知识管理体系
时至今日,互联网的分享难度大大降低,有道云笔记.Evernote.OneNote.为知笔记等笔记应用次第兴起,也带来了丰富的方式来保存你所感兴趣的内容,当然也不得不提后起之秀 Notion 和主打本地 ...
- Qt重定向QDebug,自定义一个简易的日志管理类
0.前言 相对于第三方的日志库,在 Qt 中使用 QDebug 打印更便捷,有时候也需要对 QDebug 输出进行重定向,如写入文件等. 在 Qt4 中使用 qInstallMsgHandler 函数 ...
- 超详细教程:Android Studio搭建一个与百度AI识别接口连接的Activity,用来识别植物
最近做了一个小项目,想要搭建一个能够进行图像识别的安卓APP,一路上也碰了不少坑,就在这里写一篇博客,希望萌新们也少踩坑里,也值得我以后再回来看看复习一下. 1.声明权限 <uses-permi ...
- Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)
上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页 了解了LigerUI 中Grid的基本用法 现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面. ...
- Android Okhttp3 (二) 二次封装请求管理类
okHttp介绍 通过上面的对比说明,让你不得不做出明智的选择,OkHttp是一个相对成 官网地址:http://square.github.io/okhttp/ 官方API地址:http://m.b ...
- Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(含登录验证)
1.打开VS新建一个MVC项目,右键点击项目新建一个区域Admin作为后台部分 2.既然要做登录限制我们在App_Start下面新建一个类 继承Controller作为基处理控制器. 里面Sessio ...
- Flink从入门到精通100篇(七)-如何基于 Flink 搭建一个实用有效的在线实时反欺诈平台?
前言 在大数据时代,金融科技公司通常借助消费数据来综合评估用户的信用和还款能力.这个过程中,某些中介机构会搜集大量的号并进行"养号"工作,即在一年周期里让这些号形成正常的消费.通讯 ...
- 一个实用的String实现类(C++)
2019独角兽企业重金招聘Python工程师标准>>> /************************************************* CString Clas ...
- 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)
最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...
最新文章
- 嵌入式移植NTP(Network Time Protocol)
- poj 1006(中国剩余定理)
- PHP的静态方法与普通方法
- 进程wait()与waitpid()
- Git使用教程:真正手把手教你使用git!
- eclipse中如何配置tomcat
- check-lxdialog.sh: line 3: $'\r': command not found
- Pure Pursuit纯跟踪算法Python/Matlab算法实现
- MYSQL中的空格及大小写问题
- java获取局域网内主机,java怎么获取局域网内所有主机ip
- Android 文件系统路径
- Django 分页 以及自定义分页
- c#二叉树 取叶子节点个数_图文并茂方式轻松掌握数据结构之二叉树和B树!
- 微信小程序开发的基本流程
- matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
- php十六进制转二进制,php 十六进制转化为二进制的代码
- CM9和AOKP的区别
- matlab 平行四边形,matlab计算四边形面积
- php ic卡,IC卡的数据结构认识
- 互联网创业必备工具盘点
热门文章
- 华为交换机配置Telnet步骤
- javascript--弹出对话框 四种对话框 获得用户输入值 .
- Select的OnChange()事件中获取选中的值
- 2011-07-04 22:11 Jfreechart生成曲线图数据点显示数据值
- java stringbuffer倒置_Java程序设计05——String和StringBuffer
- 如何对计算属性进行修改_「计算摄影」计算机如何学会自动地进行图像美学增强?...
- PHP页面运行一半,在PHP中仅缓存页面的一部分
- mysql 36条军规_mysql开发36条军规(转)
- 两路虚拟化服务器,当四核多路服务器碰上虚拟化
- python华为面试题10个人数3获取下标