Android修改默认SharedPreferences文件的路径,SharedPreferences常用工具类

  1 import android.app.Activity;
  2 import android.content.Context;
  3 import android.content.ContextWrapper;
  4 import android.content.SharedPreferences;
  5 
  6 import com.imageviewpager.language.MyApplication;
  7 
  8 import java.io.File;
  9 import java.lang.reflect.Field;
 10 import java.lang.reflect.InvocationTargetException;
 11 import java.lang.reflect.Method;
 12 import java.util.Map;
 13 
 14 public class SPUtil {
 15 
 16     /** debug 环境下允许修改 sp文件的路径 */
 17     public static final boolean isDebug = true;
 18     /** 修改以后的sp文件的路径 MyApplication.getContext().getExternalFilesDir(null).getAbsolutePath()=/sdcard/Android/%package_name%/file */
 19     public static final String FILE_PATH = MyApplication.getContext().getExternalFilesDir(null).getAbsolutePath();
 20 
 21     /**
 22      * 保存数据
 23      *
 24      * @param context
 25      * @param fileName 文件名, 不需要".xml"
 26      * @param keyName
 27      * @param value
 28      */
 29     public static void put(Context context, String fileName, String keyName, Object value) {
 30         SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
 31         if (value instanceof String) {
 32             editor.putString(keyName, (String) value);
 33         } else if (value instanceof Integer) {
 34             editor.putInt(keyName, (Integer) value);
 35         } else if (value instanceof Boolean) {
 36             editor.putBoolean(keyName, (Boolean) value);
 37         } else if (value instanceof Float) {
 38             editor.putFloat(keyName, (Float) value);
 39         } else if (value instanceof Long) {
 40             editor.putLong(keyName, (Long) value);
 41         } else {
 42             editor.putString(keyName, value.toString());
 43         }
 44 
 45         SharedPreferencesCompat.apply(editor);
 46     }
 47 
 48     /**
 49      * 获取数据
 50      *
 51      * @param context
 52      * @param fileName
 53      * @param keyName
 54      * @param defaultValue 默认值
 55      * @return
 56      */
 57     public static Object get(Context context, String fileName, String keyName, Object defaultValue) {
 58         SharedPreferences sp = getSharedPreferences(context, fileName);
 59         if (defaultValue instanceof String) {
 60             return sp.getString(keyName, (String) defaultValue);
 61         } else if (defaultValue instanceof Integer) {
 62             return sp.getInt(keyName, (Integer) defaultValue);
 63         } else if (defaultValue instanceof Boolean) {
 64             return sp.getBoolean(keyName, (Boolean) defaultValue);
 65         } else if (defaultValue instanceof Float) {
 66             return sp.getFloat(keyName, (Float) defaultValue);
 67         } else if (defaultValue instanceof Long) {
 68             return sp.getLong(keyName, (Long) defaultValue);
 69         }
 70         return null;
 71     }
 72 
 73 
 74     /**
 75      * 移除某个key值对应的值
 76      *
 77      * @param context
 78      * @param fileName
 79      * @param keyName
 80      */
 81     public static void remove(Context context, String fileName, String keyName) {
 82         SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
 83         editor.remove(keyName);
 84         SharedPreferencesCompat.apply(editor);
 85     }
 86 
 87     /** 清除所有数据 */
 88     public static void clear(Context context, String fileName) {
 89         SharedPreferences.Editor editor = getSharedPreferences(context, fileName).edit();
 90         editor.clear();
 91         SharedPreferencesCompat.apply(editor);
 92     }
 93 
 94     /**
 95      * 查询某个key是否已经存在
 96      *
 97      * @param context
 98      * @param keyName
 99      * @return
100      */
101     public static boolean contains(Context context, String fileName, String keyName) {
102         return getSharedPreferences(context, fileName).contains(keyName);
103     }
104 
105     /** 返回所有的键值对 */
106     public static Map<String, ?> getAll(Context context, String fileName) {
107         return getSharedPreferences(context, fileName).getAll();
108     }
109 
110 
111     /** 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 */
112     private static class SharedPreferencesCompat {
113         private static final Method sApplyMethod = findApplyMethod();
114 
115         /** 反射查找apply的方法 */
116         @SuppressWarnings({"unchecked", "rawtypes"})
117         private static Method findApplyMethod() {
118             try {
119                 Class clz = SharedPreferences.Editor.class;
120                 return clz.getMethod("apply");
121             } catch (NoSuchMethodException e) {
122             }
123 
124             return null;
125         }
126 
127         /** 如果找到则使用apply执行,否则使用commit */
128         public static void apply(SharedPreferences.Editor editor) {
129             try {
130                 if (sApplyMethod != null) {
131                     sApplyMethod.invoke(editor);
132                     return;
133                 }
134             } catch (IllegalArgumentException e) {
135             } catch (IllegalAccessException e) {
136             } catch (InvocationTargetException e) {
137             }
138             editor.commit();
139         }
140     }
141 
142     /**
143      * @param context
144      * @param fileName
145      * @return isDebug = 返回修改路径(路径不存在会自动创建)以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml<br/>
146      * !isDebug = 返回默认路径下的 SharedPreferences : /data/data/%package_name%/shared_prefs/%fileName%.xml
147      */
148     private static SharedPreferences getSharedPreferences(Context context, String fileName) {
149         if (isDebug) {
150             try {
151                 // 获取ContextWrapper对象中的mBase变量。该变量保存了ContextImpl对象
152                 Field field = ContextWrapper.class.getDeclaredField("mBase");
153                 field.setAccessible(true);
154                 // 获取mBase变量
155                 Object obj = field.get(context);
156                 // 获取ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径
157                 field = obj.getClass().getDeclaredField("mPreferencesDir");
158                 field.setAccessible(true);
159                 // 创建自定义路径
160                 File file = new File(FILE_PATH);
161                 // 修改mPreferencesDir变量的值
162                 field.set(obj, file);
163                 // 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml
164                 return context.getSharedPreferences(fileName, Activity.MODE_PRIVATE);
165             } catch (NoSuchFieldException e) {
166                 e.printStackTrace();
167             } catch (IllegalArgumentException e) {
168                 e.printStackTrace();
169             } catch (IllegalAccessException e) {
170                 e.printStackTrace();
171             }
172         }
173         // 返回默认路径下的 SharedPreferences : /data/data/%package_name%/shared_prefs/%fileName%.xml
174         return context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
175     }
176 
177 }

转自:http://www.cnblogs.com/Westfalen/p/5380737.html

原文地址:https://www.cnblogs.com/Sharley/p/6552546.html