Android常用SharedPrefenences工具类的封装

package com.manny.utils;

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

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
* Created by xushun on 2017/12/28.
*/

public class SPUtils
{
/**
* 保存在手机data区的默认的文件名
*/
public static final String FILE_NAME = “share_data”;

/**
 * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
 */
public static void put(
        Context context,
        String key,
        Object object )
{

    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );
    SharedPreferences.Editor editor = sp.edit();
    if( object instanceof String )
    {
        editor.putString( key, ( String )object );
    }
    else if( object instanceof Integer )
    {
        editor.putInt( key, ( Integer )object );
    }
    else if( object instanceof Boolean )
    {
        editor.putBoolean( key, ( Boolean )object );
    }
    else if( object instanceof Float )
    {
        editor.putFloat( key, ( Float )object );
    }
    else if( object instanceof Long )
    {
        editor.putLong( key, ( Long )object );
    }
    else
    {
        editor.putString( key, object.toString() );
    }

    SharedPreferencesCompat.apply( editor );
}

/**
 * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
 * fileName为保存在手机里的文件名
 */
public static void put(
        Context context,
        String key,
        Object object,
        String fileName )
{

    SharedPreferences sp = context.getSharedPreferences( fileName, Context.MODE_PRIVATE );
    SharedPreferences.Editor editor = sp.edit();
    if( object instanceof String )
    {
        editor.putString( key, ( String )object );
    }
    else if( object instanceof Integer )
    {
        editor.putInt( key, ( Integer )object );
    }
    else if( object instanceof Boolean )
    {
        editor.putBoolean( key, ( Boolean )object );
    }
    else if( object instanceof Float )
    {
        editor.putFloat( key, ( Float )object );
    }
    else if( object instanceof Long )
    {
        editor.putLong( key, ( Long )object );
    }
    else
    {
        editor.putString( key, object.toString() );
    }

    SharedPreferencesCompat.apply( editor );
}

/**
 * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
 * * fileName为保存在手机里的文件名
 */
public static Object get(
        Context context,
        String key,
        Object defaultObject,
        String fileName)
{
    SharedPreferences sp = context.getSharedPreferences( fileName, Context.MODE_PRIVATE );

    if( defaultObject instanceof String )
    {
        return sp.getString( key, ( String )defaultObject );
    }
    else if( defaultObject instanceof Integer )
    {
        return sp.getInt( key, ( Integer )defaultObject );
    }
    else if( defaultObject instanceof Boolean )
    {
        return sp.getBoolean( key, ( Boolean )defaultObject );
    }
    else if( defaultObject instanceof Float )
    {
        return sp.getFloat( key, ( Float )defaultObject );
    }
    else if( defaultObject instanceof Long )
    {
        return sp.getLong( key, ( Long )defaultObject );
    }

    return null;
}

/**
 * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
 */
public static Object get(
        Context context,
        String key,
        Object defaultObject )
{
    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );

    if( defaultObject instanceof String )
    {
        return sp.getString( key, ( String )defaultObject );
    }
    else if( defaultObject instanceof Integer )
    {
        return sp.getInt( key, ( Integer )defaultObject );
    }
    else if( defaultObject instanceof Boolean )
    {
        return sp.getBoolean( key, ( Boolean )defaultObject );
    }
    else if( defaultObject instanceof Float )
    {
        return sp.getFloat( key, ( Float )defaultObject );
    }
    else if( defaultObject instanceof Long )
    {
        return sp.getLong( key, ( Long )defaultObject );
    }

    return null;
}

/**
 * 移除某个key值已经对应的值
 */
public static void remove(
        Context context,
        String key )
{
    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );
    SharedPreferences.Editor editor = sp.edit();
    editor.remove( key );
    SharedPreferencesCompat.apply( editor );
}

/**
 * 清除所有数据
 */
public static void clear( Context context )
{
    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );
    SharedPreferences.Editor editor = sp.edit();
    editor.clear();
    SharedPreferencesCompat.apply( editor );
}

/**
 * 查询某个key是否已经存在
 */
public static boolean contains(
        Context context,
        String key )
{
    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );
    return sp.contains( key );
}

/**
 * 返回所有的键值对
 */
public static Map< String, ? > getAll( Context context )
{
    SharedPreferences sp = context.getSharedPreferences( FILE_NAME, Context.MODE_PRIVATE );
    return sp.getAll();
}

/**
 * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
 * 里面所有的commit操作使用了SharedPreferencesCompat.apply进行了替代,目的是尽可能的使用apply代替commit
 * 首先说下为什么,因为commit方法是同步的,并且我们很多时候的commit操作都是UI线程中,毕竟是IO操作,尽可能异步;
 * 所以我们使用apply进行替代,apply异步的进行写入;
 * 由于在apply是在API 9以后引入,所以有了这个兼容;
 */
private static class SharedPreferencesCompat
{
    private static final Method sApplyMethod = findApplyMethod();

    /**
     * 反射查找apply的方法
     */
    @SuppressWarnings( { "unchecked" , "rawtypes" } )
    private static Method findApplyMethod()
    {
        try
        {
            Class clz = SharedPreferences.Editor.class;
            return clz.getMethod( "apply" );
        }
        catch( NoSuchMethodException e )
        {
        }
        return null;
    }

    /**
     * 如果找到则使用apply执行,否则使用commit
     */
    public static void apply( SharedPreferences.Editor editor )
    {
        try
        {
            if( sApplyMethod != null )
            {
                sApplyMethod.invoke( editor );
                return;
            }
        }
        catch( IllegalArgumentException e )
        {
        }
        catch( IllegalAccessException e )
        {
        }
        catch( InvocationTargetException e )
        {
        }
        editor.commit();
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shunsix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值