参考:

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);
} }

Android 常用工具类之SPUtil,可以修改默认sp文件的路径的更多相关文章

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

    import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; ...

  2. 53. Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...

  3. 【转】Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefe ...

  4. android常用工具类

    import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkIn ...

  5. Android 常用工具类之 ScreenUtil

    需求: 截屏 参考 :    Android开发:截屏 screenshot 功能小结 package bvb.de.openadbwireless.utils; import android.app ...

  6. eclipse工具类及插件(修改eclipse.ini文件及作者名字)

    https://jingyan.baidu.com/album/9158e0005633c0a254122807.html?picindex=1 (修改eclipse.ini文件及作者名字) http ...

  7. Android 常用工具类之LogUtil,可以定位到代码行,双击跳转

    package cn.utils; import android.util.Log; public class LogUtils { public static boolean isDebug = t ...

  8. Android常用工具类封装---SharedPreferencesUtil

    SharedPreferences常用于保存一些简单的数据,如记录用户操作的配置等,使用简单. public class SharedPreferencesUtil {              // ...

  9. Android 常用工具类之 DimenUtil

    public class DimenUtil { /** sp转换成px */ public static int sp2px(float spValue) { float fontScale = M ...

随机推荐

  1. MySQL: 详细的sql语句

    1添 1.1[插入单行] insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开 ...

  2. Java遇见HTML——JSP篇之JavaWeb简介

    一.什么是WEB应用程序 Web应用程序是一种可以通过Web(互联网)访问的应用程序.Web应用程序的一个最大好处是用户很容易访问应用程序.用户只需要有浏览器即可,不需要再安装其他软件. 为什么要学习 ...

  3. Visual Studio 2015 + IIS Express 10.0 调试 ASP.NET 项目

    参考资料: https://msdn.microsoft.com/zh-cn/library/58wxa9w5(v=vs.120).aspx 首先搭建环境, 也就是用 IIS Express 配置一个 ...

  4. 解决: libcimtd.lib not found, rpcndr.lib not found

    在编译Inside COM这本书的代码的时候. 报这个错. 毕竟1996年的代码... 原因很简单: libcimtd.lib 是 VC6时代的东西(对应着iostream.h)...现在的MS编译器 ...

  5. weblogic对jms实现的QueueConnection实现与TopicConnection实现问题

    今天看了一段之前同事写jms的代码,觉得好像不对,但是不可能,生产上用的代码.刚开始想了下,脑子没转过弯来,后来一想是个简单的问题 代码如下: topicConnection = (TopicConn ...

  6. ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST

    用户反馈数据库设置归档后,无法启动,并报如下错误: SQL> startup ORA-: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST ...

  7. TOMCAT 关闭报错:Tomcat did not stop in time. PID file was not removed

    关闭tomcat的时候,报出如下错误信息: # ./shutdown.sh Using CATALINA_BASE: /opt/openkm-6.3.1-community/tomcat Using ...

  8. datagridview自动增加行高度和显示全部内容

    this.dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;  //自动调动dat ...

  9. IDEA中 @override报错的处理步骤

    今天用IDEA导入一个java工程时,JDK1.8版本,碰上一个问题,代码中所有@override处标红,并提示:@override不支持对接口的实现. 网上百度了一下发现, 原因是引用JDK5版本中 ...

  10. C++Primer 第四章

    //1.当我们对运算符进行重载的时候,其包括运算对象的类型和返回值的类型都是由该运算符定义的,但是运算对象的个数和优先级,结合律都是不能改变的 //2.当一个对象被用作右值的时候,用的是对象的值(内容 ...