程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SharedPreferences用法

SharedPreferences用法

編輯:C++入門知識

SharedPreferences用法


一、SharedPreferences將數據文件保存在指定路徑上

通過反射:

private void initSharedPreferences(String path,String name,int mode) {
    try {
        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);
	sharedPreferences = getSharedPreferences(name, mode);
	editor = sharedPreferences.edit();
    } catch (Exception e) {
	e.printStackTrace();
    }
}

原理:

查看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時,返回的路徑就是自定義的路徑。此時就達到了修改存儲路徑的目的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved