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