最近有点懒了,虽然工作不太忙,但是也没去写东西了,进入新的月份了,不能继续懒惰了,奋斗吧,骚年!

今天来分享一个关于SharedPreferences的使用技巧,SharedPreferences是Android提供的一个轻量级的数据存储类,我们可以利用它的api来存储一些简单的配置信息。关于SharedPreferences的基本用法,网上有很多,我这里就不做说明了,如果有不懂的请自行百度或者谷歌相关资料,进行学习,今天我要讲的是关于SharedPreferences的封装。我们平时的开发中肯定是不止一次的会用到SharedPreferences这个类来保存一些信息,所以如果每次都按照基本方法写一遍,代码冗余量太大,所以我们应该将它的相关操作封装起来,不仅简化代码,也方便统一管理。我这里的基本思路是采用单例模式,提供一个管理类SPManager.java,采用公共静态方法的形式将相关的put和get操作都封装到该类里面,外部直接通过类名.方法名的方式进行调用,下面来看具体代码:

一、既然是单例模式,那么老规矩三段式:

1、创建私有的静态的本类对象,即当前类的实例:

 

//创建当前类的实例
private static SPManager mInstance;
private static SharedPreferences sp;
private static SharedPreferences.Editor editor;

 

2、创建私有的构造方法,在方法里我们拿到sp对象,并通过sp对象拿到editor对象:

 

//私有的构造
private SPManager() {
    sp = BaseApplication.getContext()
            .getSharedPreferences(SHARE_PREFERENCE_NAME,
            Context.MODE_PRIVATE);
    editor = sp.edit();
}

这里补充说明一下获取sp对象时传入的两个参数,第一个参数是我们自己定义的配置文件名称,第二个是数据的操作模式,这里定义为私有模式:

 

 

//文件名
private static final String SHARE_PREFERENCE_NAME = "zdjfu.pre";

3、创建公共的静态的返回本类对象的方法:

 

 

//线程安全的返回本类对象的方法
public static SPManager getInstance() {
    if (mInstance == null) {
        synchronized (SPManager.class) {
            if (mInstance == null) {
                mInstance = new SPManager();
            }
        }
    }
    return mInstance;
}

二、接下来是一系列的put和get操作,就是写入和获取不同数据类型的数据,这里我用int类型数据来做个示例,完整代码会在文章末尾为大家附上:

 

 

//对int类型数据的写入
public void putInt(String key, int value) {
    editor.putInt(key, value);
    editor.commit();
}

//对int类型数据的读取
public int getInt(String key, int defaultValue) {
    return sp.getInt(key, defaultValue);
}

按照不同数据类型分别创建相应的方法即可完成数据的读写操作。

 

三、完成以上操作之后,就是我们的使用了,下面来说说如何使用,这里也是举个实例给大家,我这里要存储一个String类型的数据,那么我首先在类中定义了一个key,用来标识这次的数据存储操作,代码如下:

 

//设备Token
public static final String DEVICE_TOKEN = "device_token";

接着在需要保存数据的地方,调用SPManager中的putString方法,按照key-value的形式将数据保存即可,代码如下:

 

 

//将设备token存储到sp中
SPManager.getInstance().putString(SPManager.DEVICE_TOKEN, device_token);

可以看到传入了两个参数,前面的是我们定义的key,后面的是我们要保存的数据值,这样我们就完成了数据存储操作。

 

当我们需要用到之前保存的数据时,我们只要调用getString方法即可,代码如下:

 

//读取保存的设备Token信息
LogUtil.e("archie", SPManager.getInstance()
        .getString(SPManager.DEVICE_TOKEN,""));

这样我们就完成了数据的读写操作,通过我们的封装,使得代码更简洁,并且更具有可读性了,实现的原理本质上是一样的。

 

下面附上SPManager.java的源码:

 

package com.zdjfu.android.database;

import android.content.Context;
import android.content.SharedPreferences;

import com.zdjfu.android.application.BaseApplication;

/**
 * 项目名:   ZDJFUProject
 * 包名:     com.zdjfu.android.database
 * 文件名:   SPManager
 * 创建者:   Jarchie
 * 创建时间: 17/5/29 下午4:27
 * 描述:     配置文件工具类
 */

public class SPManager {
    //创建当前类的实例
    private static SPManager mInstance;
    private static SharedPreferences sp;
    private static SharedPreferences.Editor editor;
    //文件名
    private static final String SHARE_PREFERENCE_NAME = "zdjfu.pre";
    //设备Token
    public static final String DEVICE_TOKEN = "device_token";
    //注册设备Token
    public static final String REGISTER_TOKEN = "is_um_register";

    //线程安全的返回本类对象的方法
    public static SPManager getInstance() {
        if (mInstance == null) {
            synchronized (SPManager.class) {
                if (mInstance == null) {
                    mInstance = new SPManager();
                }
            }
        }
        return mInstance;
    }

    //私有的构造
    private SPManager() {
        sp = BaseApplication.getContext()
                .getSharedPreferences(SHARE_PREFERENCE_NAME,
                        Context.MODE_PRIVATE);
        editor = sp.edit();
    }

    //对int类型数据的写入
    public void putInt(String key, int value) {
        editor.putInt(key, value);
        editor.commit();
    }

    //对int类型数据的读取
    public int getInt(String key, int defaultValue) {
        return sp.getInt(key, defaultValue);
    }

    //对long类型数据的写入
    public void putLong(String key, Long value) {
        editor.putLong(key, value);
        editor.commit();
    }

    //对long类型数据的读取
    public long getLong(String key, int defaultValue) {
        return sp.getLong(key, defaultValue);
    }

    //对string类型数据的写入
    public void putString(String key, String value) {
        editor.putString(key, value);
        editor.commit();
    }

    //对string类型数据的读取
    public String getString(String key, String defaultValue) {
        return sp.getString(key, defaultValue);
    }

    //对float类型数据的写入
    public void putFloat(String key, float value) {
        editor.putFloat(key, value);
        editor.commit();
    }

    //对float类型数据的读取
    public float getFloat(String key, float defaultValue) {
        return sp.getFloat(key, defaultValue);
    }

    //对boolean类型数据的写入
    public void putBoolean(String key, boolean value) {
        editor.putBoolean(key, value);
        editor.commit();
    }

    //对boolean类型数据的读取
    public boolean getBoolean(String key, boolean defaultValue) {
        return sp.getBoolean(key, defaultValue);
    }

    //判断key是否存在
    public boolean isKeyExist(String key) {
        return sp.contains(key);
    }

    //删除单个数据,按照key类型
    public void remove(String key) {
        editor.remove(key);
        editor.commit();
    }

    //删除所有数据
    public void removeAllSPData() {
        editor.clear().commit();
    }
}

写的比较仓促,有不对的地方欢迎朋友们批评指正!