/**

* 用反射生成 SharedPreferences

* @param context

* @param dir

* @param fileName 文件名,不需要 '.xml' 后缀

* @return

*/

private static SharedPreferences getMySharedPreferences(Context context,String dir,String fileName) {

try {

// 获取 ContextWrapper对象中的mBase变量。该变量保存了 ContextImpl 对象

Field field_mBase = ContextWrapper.class.getDeclaredField("mBase");

field_mBase.setAccessible(true);

// 获取 mBase变量

Object obj_mBase = field_mBase.get(context);

// 获取 ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径

Field field_mPreferencesDir = obj_mBase.getClass().getDeclaredField("mPreferencesDir");

field_mPreferencesDir.setAccessible(true);

// 创建自定义路径

// String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android";

File file = new File(dir);

// 修改mPreferencesDir变量的值

field_mPreferencesDir.set(obj_mBase,file);

// 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml

Log.e(TAG,"getMySharedPreferences filep="+file.getAbsolutePath()+"| fileName="+fileName);

return context.getSharedPreferences(fileName,Activity.MODE_PRIVATE);

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

Log.e(TAG,"getMySharedPreferences end filename="+fileName);

// 返回默认路径下的 SharedPreferences : /data/data/%package_name%/shared_prefs/%fileName%.xml

return context.getSharedPreferences(fileName,Context.MODE_PRIVATE);

}

//通过putValue() 方法保存到系统原来的Sp 中

SharedPreferences saveInfoNew = getMySharedPreferences(mContext,dir,fileName);

for (Map.Entry entry : saveInfoNew.getAll().entrySet()) {

putValue(entry.getKey(),entry.getValue());

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐