• Android 常用工具类之SPUtil,可以修改默认sp文件的路径


    参考:

    1.  利用Java反射机制改变SharedPreferences存储路径    Singleton1900

    2.  Android快速开发系列 10个常用工具类        Hongyang

    import android.app.Activity;
    import android.content.Context;
    import android.content.ContextWrapper;
    import android.content.SharedPreferences;
    
    import com.imageviewpager.language.MyApplication;
    
    import java.io.File;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Map;
    
    public class SPUtil {
    
        /** debug 环境下允许修改 sp文件的路径 */
        public static final boolean isDebug = true;
        /** 修改以后的sp文件的路径 MyApplication.getContext().getExternalFilesDir(null).getAbsolutePath()=/sdcard/Android/%package_name%/file */
        public static final String FILE_PATH = MyApplication.getContext().getExternalFilesDir(null).getAbsolutePath();
    
        /**
         * 保存数据
         *
         * @param context
         * @param fileName 文件名, 不需要".xml"
         * @param keyName
         * @param value
         */
        public static void put(Context context, String fileName, String keyName, Object value) {
            SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
            if (value instanceof String) {
                editor.putString(keyName, (String) value);
            } else if (value instanceof Integer) {
                editor.putInt(keyName, (Integer) value);
            } else if (value instanceof Boolean) {
                editor.putBoolean(keyName, (Boolean) value);
            } else if (value instanceof Float) {
                editor.putFloat(keyName, (Float) value);
            } else if (value instanceof Long) {
                editor.putLong(keyName, (Long) value);
            } else {
                editor.putString(keyName, value.toString());
            }
    
            SharedPreferencesCompat.apply(editor);
        }
    
        /**
         * 获取数据
         *
         * @param context
         * @param fileName
         * @param keyName
         * @param defaultValue 默认值
         * @return
         */
        public static Object get(Context context, String fileName, String keyName, Object defaultValue) {
            SharedPreferences sp = getSharedPreferences(context, fileName);
            if (defaultValue instanceof String) {
                return sp.getString(keyName, (String) defaultValue);
            } else if (defaultValue instanceof Integer) {
                return sp.getInt(keyName, (Integer) defaultValue);
            } else if (defaultValue instanceof Boolean) {
                return sp.getBoolean(keyName, (Boolean) defaultValue);
            } else if (defaultValue instanceof Float) {
                return sp.getFloat(keyName, (Float) defaultValue);
            } else if (defaultValue instanceof Long) {
                return sp.getLong(keyName, (Long) defaultValue);
            }
            return null;
        }
    
    
        /**
         * 移除某个key值对应的值
         *
         * @param context
         * @param fileName
         * @param keyName
         */
        public static void remove(Context context, String fileName, String keyName) {
            SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
            editor.remove(keyName);
            SharedPreferencesCompat.apply(editor);
        }
    
        /** 清除所有数据 */
        public static void clear(Context context, String fileName) {
            SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
            editor.clear();
            SharedPreferencesCompat.apply(editor);
        }
    
        /**
         * 查询某个key是否已经存在
         *
         * @param context
         * @param keyName
         * @return
         */
        public static boolean contains(Context context, String fileName, String keyName) {
            return getSharedPreferences(context, fileName).contains(keyName);
        }
    
        /** 返回所有的键值对 */
        public static Map<String, ?> getAll(Context context, String fileName) {
            return getSharedPreferences(context, fileName).getAll();
        }
    
    
        /** 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 */
        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();
            }
        }
    
        /**
         * @param context
         * @param fileName
         * @return isDebug = 返回修改路径(路径不存在会自动创建)以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml<br/>
         * !isDebug = 返回默认路径下的 SharedPreferences : /data/data/%package_name%/shared_prefs/%fileName%.xml
         */
        private static SharedPreferences getSharedPreferences(Context context, String fileName) {
            if (isDebug) {
                try {
                    // 获取ContextWrapper对象中的mBase变量。该变量保存了ContextImpl对象
                    Field field = ContextWrapper.class.getDeclaredField("mBase");
                    field.setAccessible(true);
                    // 获取mBase变量
                    Object obj = field.get(context);
                    // 获取ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径
                    field = obj.getClass().getDeclaredField("mPreferencesDir");
                    field.setAccessible(true);
                    // 创建自定义路径
                    File file = new File(FILE_PATH);
                    // 修改mPreferencesDir变量的值
                    field.set(obj, file);
                    // 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml
                    return context.getSharedPreferences(fileName, Activity.MODE_PRIVATE);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            // 返回默认路径下的 SharedPreferences : /data/data/%package_name%/shared_prefs/%fileName%.xml
            return context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        }
    
    }
  • 相关阅读:
    ORACLE学习记录
    Oracle拆分字符串函数
    spring3.2.5学习(二)——IoC注解配置
    spring3.2.5学习(一)——spring环境配置以及IOC简介
    使用SQL脚本将表字段生成实体类属性VO
    JAVA多线程笔试题
    初步接触LVS
    linux中shell,awk,sed截取字符串方法总结
    调用sort段错误问题
    开源软件许可协议简介
  • 原文地址:https://www.cnblogs.com/Westfalen/p/5380737.html
Copyright © 2020-2023  润新知