साझा प्राथमिकताओं को xml फ़ाइल में data/data/your.application.package/shared_prefs/
फ़ोल्डर में संग्रहीत किया जाता है। फ़ाइल को your.application.package_preferences.xml
कहा जाता है;
जब आप साझा प्राथमिकताओं को पुनर्प्राप्त करते हैं, तो आप Context.getSharedPreferences विधि को कॉल करते हैं। यह SharedReferences
ऑब्जेक्ट बनाता है और SharedReferences.startLoadFromDisk विधि को आमंत्रित करता है।
यदि आप इस विधि को खोलते हैं, तो आप देखेंगे कि प्राथमिकता वाले xml फ़ाइल (mFile
) को पार्स किया गया है और वरीयताओं को मेमोरी स्टोरेज (map
) में लोड किया गया है।
BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024);
map = XmlUtils.readMapXml(str);
तब से आप हमेशा स्मृति से अपनी प्राथमिकताओं को पढ़ेंगे। private Map<String, Object> mMap
चर से बिल्कुल। इसके अलावा एप्लिकेशन startReloadIfChangedUnexpectedly विधि को कॉल कर सकता है और यदि अंतर्निहित फ़ाइल बदल दी गई है, तो इसे पार्स किया जाएगा और एक नया हैश मैप बनाया जाएगा।
अपने प्रश्न के रूप में, वहाँ निम्नलिखित मामलों हैं:
आप एक नए संस्करण में एक प्राथमिकता आइटम जोड़ा। फिर दूसरे पैरामीटर के रूप में निर्दिष्ट डिफ़ॉल्ट मान वापस कर दिया जाएगा। नोट: विशेषता एंड्रॉइड: डिफ़ॉल्ट वैल्यू का उपयोग नहीं किया जाता है, इसलिए जागरूक रहें।
String v = (String)mMap.get(key); // not found => v = null
return v != null ? v : defValue; // return defValue
आप एक नए संस्करण में एक प्राथमिकता आइटम निकाला। एक्सएमएल फ़ाइल और map
ऑब्जेक्ट में कुछ अनावश्यक डेटा होगा, लेकिन जब उपयोगकर्ता अगली बार प्राथमिकताएं सहेजता है तो यह तय किया जाएगा।
आपने किसी वरीयता आइटम की कुंजी को कुछ कुंजी में बदल दिया जिसका उपयोग नहीं किया गया था। फिर डिफ़ॉल्ट मान वापस कर दिया जाएगा। पी .1 के समान परिणाम।
(उदाहरण के लिए कुंजी pref1_key
साथ,) एक वरीयता आइटम निकाला और एक अन्य मद की कुंजी बदल इतना है कि यह पहला आइटम (pref2_key
से pref1_key
करने के लिए) को दर्शाता है। फिर दूसरी प्राथमिकता आइटम में पहले आइटम का मूल्य होगा।
- आपने एक प्रकार का वरीयता आइटम बदल दिया (उदाहरण के लिए बूलियन से int तक)। फिर यह इस और इसी तरह के कोड के कारण CastException फेंक देगा:
(Integer)mMap.get(key);
। लेकिन आप, उदाहरण के लिए, ListTextPreference को ListPreference में बदल सकते हैं, क्योंकि दोनों के पास स्ट्रिंग प्रकार है।
हो सकता है कि वहाँ कुछ और परीक्षण मामलों रहे हैं, लेकिन अब तक मैं केवल 5.
ऊपर कर दिया है इसके अलावा यहाँ उदाहरण है की वरीयताओं ListPreference, EditTextPreference और CheckBoxPreference साथ फाइल:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="pref_theme_key">THEME_LIGHT</string>
<string name="pref_homepage_key">test</string>
<boolean name="pref_display_name_key" value="true" />
</map>
आप prefs XML फ़ाइल को डीडीएमएस से खींच सकते हैं और यदि आप – mango