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這個類讀壹下就明白了,這段不復雜