色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 利用Java反射機制改變SharedPreferences存儲路徑

利用Java反射機制改變SharedPreferences存儲路徑 時間:2018-09-21      來源:未知

近在做一個項目,想到要使用SharedPreferences類去存儲一些簡單的數據,但是我們知道,使用SharedPreferences保存數據,其實質是采用了xml文件存放數據,路徑為:/data/data/<package name>/shared_prefs. 但是有些時候,我們不想將xml文件存儲到SharedPreferences累指定的目錄下,比如說,我想將xml文件存儲到sdcard下面,這個時候,我們該怎么辦呢?

我們知道,SharedPreferences是封裝好的類,我們只能使用類提供的方法,但是我們也知道,使用java的反射機制,類在我們面前就是透明的,我們可以任意使用類中的方法,變量,構造器等等。所以,這里,我想到使用java的反射機制去解決這個問題。但是在使用java的反射機制之前,有些概念我們還是要了解的。

Context類路徑:/frameworks/base/core/java/android/content/Context.java

說明:抽象類,提供了一組通用的API。

源代碼(部分)如下:

public abstract class Context {

...

public abstract Object getSystemService(String name); //獲得系統級服務

public abstract void startActivity(Intent intent); //通過一個Intent啟動Activity

public abstract ComponentName startService(Intent service); //啟動Service

//根據文件名得到SharedPreferences對象

public abstract SharedPreferences getSharedPreferences(String name,int mode);

...

}

ContextIml.java類 路徑 :/frameworks/base/core/java/android/app/ContextImpl.java

說明:該Context類的實現類為ContextIml,該類實現了Context類的功能。請注意,該函數的大部分功能都是直接調用。

其屬性mPackageInfo去完成。

源代碼(部分)如下:

/**

* Common implementation of Context API, which provides the base

* context object for Activity and other application components.

*/

class ContextImpl extends Context{

//所有Application程序公用一個mPackageInfo對象

/*package*/ ActivityThread.PackageInfo mPackageInfo;

@Override

public Object getSystemService(String name){

...

else if (ACTIVITY_SERVICE.equals(name)) {

return getActivityManager();

}

else if (INPUT_METHOD_SERVICE.equals(name)) {

return InputMethodManager.getInstance(this);

}

}

@Override

public void startActivity(Intent intent) {

...

//開始啟動一個Activity

mMainThread.getInstrumentation().execStartActivity(

getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);

}

}

ContextWrapper類 路徑 :\frameworks\base\core\java\android\content\ContextWrapper.java

說明: 正如其名稱一樣,該類只是對Context類的一種包裝,該類的構造函數包含了一個真正的Context引用,即ContextIml對象。源代碼(部分)如下:

public class ContextWrapper extends Context {

Context mBase; //該屬性指向一個ContextIml實例,一般在創建Application、Service、Activity時賦值

//創建Application、Service、Activity,會調用該方法給mBase屬性賦值

protected void attachBaseContext(Context base) {

if (mBase != null) {

throw new IllegalStateException("Base context already set");

}

mBase = base;

}

@Override

public void startActivity(Intent intent) {

mBase.startActivity(intent); //調用mBase實例方法

}

}

Context相關類的繼承關系

利用Java反射機制改變SharedPreferences存儲路徑

SharedPreferences原則上只能保存在當前應用程序私有的Shared_prefs目錄中,但利用Java的反射機制可以改變系統內定的文件存儲路徑。

例如:將config.xml文件保存在SD卡的根目錄中。

private void savePreToSDcard() {

try {

Field field; // 獲取ContextWrapper對象中的mBase變量。該變量保存了ContextImpl對象

field = ContextWrapper.class.getDeclaredField("mBase");

field.setAccessible(true);

// 獲取mBase變量

Object obj = field.get(this);

// 獲取ContextImpl.mPreferencesDir變量,該變量保存了數據文件的保存路徑

field = obj.getClass().getDeclaredField("mPreferencesDir");

field.setAccessible(true);

// 創建自定義路徑

File file = new File("/sdcard");

// 修改mPreferencesDir變量的值

field.set(obj, file);

SharedPreferences mySharedPreferences = getSharedPreferences( "config", Activity.MODE_PRIVATE);

SharedPreferences.Editor editor = mySharedPreferences.edit();

editor.putString("name", "20130310");

editor.commit();

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

上一篇:Coretex_M0工程創建

下一篇:安卓中實現藍牙通信的工具

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 欧美成人免费一区二区 | 免费毛儿一区二区十八岁 | 三年片在线观看免费大全爱奇艺 | 国产伦乱| 亚洲欧美国产成人综合不卡 | 精品性影院一区二区三区内射 | 亚洲精品宾馆在线精品酒店 | 狠狠干狠狠色 | 国产精品久久久久久久久无码日本蜜乳 | 亚洲精品无码成人A片蜜臀 无码国产69精品久久久久孕妇 | 国产麻豆剧果冻传媒一区 | 日本人妻巨大乳挤奶水免费 | 成人性做爰aaa片免费看 | 亚洲另类无码专区丝袜 | 成人亚洲一区二区三区在线 | 少妇张开腿露私下 | a片无遮挡网站免费观看 | 日本欧美产无码久久久久又大又粗 | 蜜桃传免费看片www 欧美黄色试片 | 久久久无码精品亚洲日韩蜜臀浪潮 | 熟妇人妻系列AV无码一区二区 | 无码人中文字幕 | 桃色AV久久无码线观看 | AV无码免费一区二区三区 | 国产aⅴ激情无码久久 | 久久人人爽人人爽人人片DVD | 日本妇人成熟免费中文字幕 | 农村熟妇高潮精品A片 | 日本午夜成年在线网站 | 白丝袜美女扒开内衣网站 | h高潮娇喘抽搐A片国产麻豆 | 三级理论日韩欧美 | 国产无遮挡又黄又爽不要VIP软件 | 国产亚洲精品无码专区 | 色诱福利视频网址 | m豆传媒 | 成人免费A片在线看网站外卖员 | 日本黄在线观看 | 国产一区二区播放 | 国产丝袜无码一区二区视频 | 白丝无内液液酱视频在线观看 |