當前位置:編程學習大全網 - 源碼下載 - android中getSharedPreferences方法實現原理

android中getSharedPreferences方法實現原理

Context的真正實現在ContextImpl這個類裏,常用的Context其實都是這個類的實例,這個類訪問屬性是package,所以在Eclipse看不到這個類,要去android源碼目錄下找

貼出getSharedPreferences方法的實現源碼

/**

*?Map?from?package?name,?to?preference?name,?to?cached?preferences.

*/

private?static?ArrayMap<String,?ArrayMap<String,?SharedPreferencesImpl>>?sSharedPrefs;@Override

public?SharedPreferences?getSharedPreferences(String?name,?int?mode)?{

SharedPreferencesImpl?sp;

synchronized?(ContextImpl.class)?{

if?(sSharedPrefs?==?null)?{

sSharedPrefs?=?new?ArrayMap<String,?ArrayMap<String,?SharedPreferencesImpl>>();

}

final?String?packageName?=?getPackageName();

ArrayMap<String,?SharedPreferencesImpl>?packagePrefs?=?sSharedPrefs.get(packageName);

if?(packagePrefs?==?null)?{

packagePrefs?=?new?ArrayMap<String,?SharedPreferencesImpl>();

sSharedPrefs.put(packageName,?packagePrefs);

}

//?At?least?one?application?in?the?world?actually?passes?in?a?null

//?name.?This?happened?to?work?because?when?we?generated?the?file?name

//?we?would?stringify?it?to?"null.xml".?Nice.

if?(mPackageInfo.getApplicationInfo().targetSdkVersion?<

Build.VERSION_CODES.KITKAT)?{

if?(name?==?null)?{

name?=?"null";

}

}

sp?=?packagePrefs.get(name);

if?(sp?==?null)?{

File?prefsFile?=?getSharedPrefsFile(name);

sp?=?new?SharedPreferencesImpl(prefsFile,?mode);

packagePrefs.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;

}

實際上返回的也是SharedPreferences的實現類SharedPreferencesImpl實例,SharedPreferences內部的存儲實現我就不廢話了,找到SharedPreferencesImpl這個類讀壹下就明白了,這段不復雜

  • 上一篇:橡皮擦中文源代碼
  • 下一篇:第壹款ai交互搜索app是什麽樣的?
  • copyright 2024編程學習大全網