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实例

//2
 Editor editor = sp.edit();
 editor.putString("msg", "hello world");
 editor.commit();
//通过editor存储数据

//3
 sp.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,然后调用实例,就可以直接简单的操作了。源码地址:源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值