SharedPreferences用法

一、SharedPreferences将数据文件保存在指定路径上(修改SharedPreferences存储路径)

通过反射:

<span style="color:#333333;">private void initSharedPreferences(String path,String name,int mode) {
    try {
        </span><span style="color:#ff0000;">Field field =ContextWrapper.class.getDeclaredField("mBase");
	field.setAccessible(true);
	Object obj = field.get(this);
	field = obj.getClass().getDeclaredField("mPreferencesDir");
	field.setAccessible(true);
	File file = new File(path);
	field.set(obj, file);</span><span style="color:#333333;">
	sharedPreferences = getSharedPreferences(name, mode);
	editor = sharedPreferences.edit();
    } catch (Exception e) {
	e.printStackTrace();
    }
}</span>

原理:

查看getSharedPreferences源码(ContextImpl.java类)

@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
    SharedPreferencesImpl sp;
    synchronized (sSharedPrefs) {
        sp = sSharedPrefs.get(name);
        if (sp == null) {
            File prefsFile = getSharedPrefsFile(name);
            sp = new SharedPreferencesImpl(prefsFile, mode);
            sSharedPrefs.put(name, sp);
            return sp;
        }
    }
    if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
        getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
        // If somebody else (some other process) changed the prefs
        // file behind our back, we reload it.  This has been the
        // historical (if undocumented) behavior.
        sp.startReloadIfChangedUnexpectedly();
    }
    return sp;
}

查看上段代码中getSharedPrefsFile(name)方法:

public File getSharedPrefsFile(String name) {
    return makeFilename(getPreferencesDir(), name + ".xml");
}
private File getPreferencesDir() {
    synchronized (mSync) {
        if (mPreferencesDir == null) {
             mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
         }
         return mPreferencesDir;
    }
}

可以看到如果mPreferencesDir(一个全局变量,保存sharedPreferences的路径) 为空时,就在默认路径下创建文件(data/data/packageName路径下),所以,先通过反射,将路径赋给 mPreferencesDir变量,在调用getSharedPreferences-->getSharedPrefsFile-->getPreferencesDir时,返回的路径就是自定义的路径。此时就达到了修改存储路径的目的。


二、访问别的应用的SharedPreference

如:B要访问A中的SharedPreference

1、首先,A在创建SharedPreference时,需要指定权限Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE

getSharedPreferences("appPerferences", Context.MODE_WORLD_READABLE);

2、在B中首先要获得A的上下文对象 Context,然后通过A应用的Context来访问

Context appContext = createPackageContext("com.test.app", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = appContext.getSharedPreferences("appPerferences",  Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");

或者:

直接通过解析data/data/packageName(A应用包名)下面的sharedpreference文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值