SharedPreferences Android पर एक की-वैल्यू डेटा स्टोरेज है जो सरल सेटिंग्स और ऐप कॉन्फ़िगरेशन को सहेजने के लिए डिज़ाइन किया गया है। डेटा डिवाइस पर XML फ़ाइल में संग्रहीत होता है और केवल उस ऐप के अंदर ही उपलब्ध होता है जिसने इसे बनाया है। आधिकारिक दस्तावेज़ीकरण के अनुसार Android Developers, 2025, SharedPreferences प्रिमिटिव टाइप्स: String, Int, Boolean, Float, Long और Set<String> के स्टोरेज को सपोर्ट करता है। यह SQL क्वेरी या सीधे फ़ाइल सिस्टम के साथ काम किए बिना छोटी मात्रा में उपयोगकर्ता सेटिंग्स को सहेजने का सबसे सरल और तेज़ समाधान है।
मुख्य बातें
SharedPreferences Android की एक अंतर्निहित प्रणाली है जो डिवाइस की आंतरिक स्टोरेज पर XML फ़ाइल में की-वैल्यू जोड़े संग्रहीत करती है। यह API Level 1 से उपलब्ध है और इसे किसी अतिरिक्त लाइब्रेरी की आवश्यकता नहीं है। इसका मुख्य उद्देश्य उपयोगकर्ता प्राथमिकताओं, इंटरफ़ेस स्थिति, पहले लॉन्च के फ़्लैग और अन्य सरल डेटा को सहेजना है जिनके लिए संरचित डेटाबेस की आवश्यकता नहीं होती।
प्रत्येक SharedPreferences फ़ाइल एक विशिष्ट नाम और एक्सेस मोड से जुड़ी होती है। डिफ़ॉल्ट रूप से Context.MODE_PRIVATE मोड उपयोग होता है, जो फ़ाइल तक पहुँच को केवल वर्तमान ऐप तक सीमित करता है। पहले Android MODE_WORLD_READABLE और MODE_WORLD_WRITEABLE मोड सपोर्ट करता था, लेकिन वे API Level 17 से पदावनत घोषित कर दिए गए और सुरक्षा कारणों से Android 7.0 (API 24) में पूरी तरह हटा दिए गए।
अपनी सरलता के बावजूद, SharedPreferences लाखों Android ऐप्स में उपयोग होता है। Google के अनुसार, Google Play पर प्रकाशित 90% से अधिक ऐप्स सेटिंग्स संग्रहीत करने के लिए SharedPreferences का उपयोग करते हैं। हालांकि, जटिल परिदृश्यों (बड़े डेटा वॉल्यूम, टाइप सुरक्षा, एसिंक्रोनी) के लिए Google Android Jetpack लाइब्रेरी से Preferences DataStore जैसे अधिक आधुनिक समाधान सुझाता है।
भौतिक रूप से, SharedPreferences ऐप निर्देशिका में XML फ़ाइल के रूप में संग्रहीत होता है: /data/data/{package_name}/shared_prefs/{file_name}.xml। फ़ाइल में संग्रहीत मान के प्रकार के आधार पर मूल तत्व <map> होता है जिसमें चाइल्ड तत्व <string>, <int>, <boolean>, <float> और <long> होते हैं। फ़ाइल आकार सीमित नहीं है, लेकिन बड़े डेटा वॉल्यूम (100 KB से अधिक) के लिए पढ़ने और लिखने का प्रदर्शन काफी कम होने लगता है।
SharedPreferences फ़ाइलें डिफ़ॉल्ट रूप से एन्क्रिप्टेड नहीं होतीं। डेटा डिवाइस की फ़ाइल सिस्टम पर सादे पाठ में संग्रहीत होता है। संवेदनशील डेटा (टोकन, पासवर्ड) संग्रहीत करने के लिए AndroidX Security लाइब्रेरी से EncryptedSharedPreferences उपयोग करने की सलाह दी जाती है, जो AES256-GCM के साथ स्वचालित रूप से कुंजियों और मानों को एन्क्रिप्ट करती है।
SharedPreferences समय-समय पर डिस्क सिंक्रोनाइज़ेशन के साथ मेमोरी कैशिंग के सिद्धांत पर काम करता है। पहली बार फ़ाइल तक पहुँचने पर (getSharedPreferences के माध्यम से), Android XML फ़ाइल को RAM में लोड करता है और इसे Map ऑब्जेक्ट में पार्स करता है। सभी बाद की रीड ऑपरेशन डिस्क से दोबारा पढ़े बिना मेमोरी से की जाती हैं। यह डेटा तक उच्च गति पहुँच सुनिश्चित करता है।
राइट ऑपरेशन Editor का उपयोग करते हैं — एक आंतरिक परिवर्तन बफ़र। जब डेवलपर putString या putBoolean कॉल करता है, तो परिवर्तन मेमोरी में Editor ऑब्जेक्ट में संग्रहीत हो जाते हैं। डिस्क पर वास्तविक लेखन commit (सिंक्रोनस) या apply (एसिंक्रोनस) विधि कॉल करने पर होता है। इन विधियों को कॉल करने तक डेटा सहेजा नहीं जाता, और ऐप के अप्रत्याशित रूप से क्रैश होने पर परिवर्तन खो सकते हैं।
SharedPreferences इंस्टेंस प्राप्त करने के लिए दो विधियाँ उपयोग होती हैं: getPreferences और getSharedPreferences। पहली केवल Activity के अंदर उपलब्ध है और Activity के नाम से फ़ाइल बनाती है। दूसरी अधिक लचीली है, फ़ाइल नाम और एक्सेस मोड स्वीकार करती है, और किसी भी कॉन्टेक्स्ट (Application, Activity, Service) से उपलब्ध है। अनुशंसा है कि getSharedPreferences का उपयोग ऐसे फ़ाइल नाम के साथ करें जो ऐप के मॉड्यूल या कार्यक्षमता से मेल खाता हो।
// SharedPreferences प्राप्त करना
val prefs = context.getSharedPreferences(
"user_settings", Context.MODE_PRIVATE
)
// डेटा लिखना
with(prefs.edit()) {
putString("username", "अन्ना")
putInt("age", 28)
putBoolean("isLoggedIn", true)
apply()
}
// डेटा पढ़ना
val username = prefs.getString("username", "")
val age = prefs.getInt("age", 0)
val isLoggedIn = prefs.getBoolean("isLoggedIn", false)
MODE_MULTI_PROCESS (पदावनत) का उपयोग करते समय SharedPreferences प्रक्रियाओं के बीच सिंक्रोनाइज़ होता है। हालांकि, यह सिंक्रोनाइज़ेशन परमाणुता की गारंटी नहीं देता, और Google मल्टी-प्रोसेस परिदृश्यों में SharedPreferences से बचने की सलाह देता है। ऐसे मामलों के लिए ContentProvider, इंटर-प्रोसेस एक्सेस वाला Room या DataStore उपयोग करना बेहतर है।
SharedPreferences कुंजी द्वारा डेटा पढ़ने के लिए विधियों का एक सेट और लिखने के लिए Editor इंटरफ़ेस प्रदान करता है। प्रत्येक रीड विधि दो पैरामीटर लेती है: एक कुंजी और एक डिफ़ॉल्ट मान जो कुंजी न मिलने पर लौटाया जाता है। डिफ़ॉल्ट मान रिटर्न टाइप भी निर्धारित करता है: getString String लौटाता है, getInt Int लौटाता है, इत्यादि।
| रीड विधि | राइट विधि | डेटा प्रकार |
|---|---|---|
| getString | putString | String |
| getInt | putInt | Int |
| getBoolean | putBoolean | Boolean |
| getFloat | putFloat | Float |
| getLong | putLong | Long |
| getStringSet | putStringSet | Set<String> |
Editor SharedPreferences का एक आंतरिक ऑब्जेक्ट है जो बफ़र में परिवर्तन एकत्र करता है। सभी परिवर्तन करने के बाद, डेवलपर commit() (सिंक्रोनस राइट) या apply() (एसिंक्रोनस राइट) कॉल करता है। अंतर महत्वपूर्ण है: commit वर्तमान थ्रेड को डिस्क पर पूर्ण लेखन तक ब्लॉक करता है और boolean (सफलता/विफलता) लौटाता है, जबकि apply बैकग्राउंड थ्रेड में लेखन करता है और तुरंत नियंत्रण लौटाता है लेकिन परिणाम नहीं देता।
अनुशंसा है कि सभी मामलों में जहाँ लेखन परिणाम जानना आवश्यक नहीं है, commit के बजाय apply का उपयोग करें। apply तेज़ है और UI थ्रेड को ब्लॉक नहीं करता। commit का उपयोग केवल तब करें जब यह जानना महत्वपूर्ण हो कि डेटा सफलतापूर्वक सहेजा गया या नहीं, या मल्टी-प्रोसेस मोड में काम करते समय। व्यक्तिगत कुंजियाँ हटाने के लिए remove विधि का उपयोग होता है, पूर्ण सफाई के लिए — clear। सभी हटाने के ऑपरेशन भी Editor के माध्यम से किए जाते हैं।
// एकाधिक परिवर्तन - एक apply
prefs.edit {
putString("theme", "dark")
putBoolean("notifications", false)
remove("old_key")
}
// मान परिवर्तन श्रोता
prefs.registerOnSharedPreferenceChangeListener { prefs, key ->
Log.d("TAG", "कुंजी बदली: $key")
}
Android 12 (API 31) से शुरू करते हुए, SharedPreferences को Lifecycle के माध्यम से स्वचालित अनसब्सक्रिप्शन के साथ registerOnSharedPreferenceChangeListener के समर्थन के साथ बढ़ाया गया। यह भूल गए listener से जुड़ी मेमोरी लीक से बचने में मदद करता है। पुराने संस्करणों में, डेवलपर को कॉम्पोनेंट के onDestroy या onStop में मैन्युअल रूप से unregisterOnSharedPreferenceChangeListener कॉल करना होता है।
अपने व्यापक उपयोग के बावजूद, SharedPreferences Android पर सभी डेटा स्टोरेज परिदृश्यों के लिए एक सार्वभौमिक समाधान नहीं है। डेटा वॉल्यूम, टाइप सुरक्षा आवश्यकताओं और प्रदर्शन के आधार पर, Google Android Jetpack और मानक Android लाइब्रेरी में शामिल विभिन्न विकल्प सुझाता है।
| समाधान | कब उपयोग करें | कमियाँ |
|---|---|---|
| SharedPreferences | छोटी सेटिंग्स (100 कुंजियों तक) | कोई टाइप सुरक्षा नहीं, सिंक्रोनस रीडिंग |
| DataStore | कोरूटीन के साथ मध्यम जटिलता की सेटिंग्स | API 14 से नीचे कोई बैकवर्ड संगतता नहीं |
| Room | संरचित डेटा और सूचियाँ | 3-5 सेटिंग्स के लिए अत्यधिक |
| EncryptedSharedPreferences | संवेदनशील डेटा और टोकन | AndroidX Security पर निर्भरता |
DataStore Android Jetpack लाइब्रेरी है जिसे Google ने SharedPreferences के विकल्प के रूप में प्रस्तुत किया है। यह दो वेरिएंट प्रदान करता है: Preferences DataStore (की-वैल्यू, SharedPreferences की तरह) और Proto DataStore (Protocol Buffers के माध्यम से टाइप की गई स्टोरेज)। DataStore एसिंक्रोनस संचालन के लिए कोरूटीन और Flow का उपयोग करता है, टाइप सुरक्षा सुनिश्चित करता है, और स्वचालित रूप से वर्ज़न माइग्रेशन संभालता है। Google सभी नए प्रोजेक्ट्स के लिए DataStore की सलाह देता है।
DataStore का मुख्य लाभ API स्तर पर एसिंक्रोनी है। सभी रीड ऑपरेशन Flow लौटाते हैं, और राइट ऑपरेशन suspend फ़ंक्शन हैं। यह UI थ्रेड ब्लॉकिंग को पूरी तरह समाप्त करता है जो SharedPreferences की सिंक्रोनस रीडिंग में हो सकती है। इसके अलावा, DataStore डेटा संगति सुनिश्चित करता है: लेखन एक लेन-देन में किया जाता है, और विफलता पर सभी परिवर्तन वापस रोल हो जाते हैं।
एक व्यावहारिक उदाहरण देखें: Android ऐप में थीम सेटिंग्स (हल्का/गहरा/सिस्टम)। उपयोगकर्ता एक थीम चुनता है, और चयन SharedPreferences में सहेजा जाता है। बाद के ऐप लॉन्च में, थीम सहेजी गई सेटिंग्स से पुनर्स्थापित होती है। रिएक्टिव UI अपडेट के लिए, SharedPreferences.OnSharedPreferenceChangeListener के माध्यम से परिवर्तनों का अवलोकन उपयोग होता है।
आइए एक ThemePreferences क्लास बनाएं जो थीम के लिए SharedPreferences के साथ सभी काम को एनकैप्सुलेट करती है। क्लास getTheme (रीडिंग), setTheme (राइटिंग) और observeTheme (अवलोकन) विधियाँ प्रदान करती है। सेटिंग्स फ़ाइल का नाम "app_preferences" MODE_PRIVATE मोड के साथ होगा। सुविधा के लिए, कुंजियाँ कॉन्स्टेंट के रूप में कंपैनियन ऑब्जेक्ट में रखी गई हैं।
class ThemePreferences(context: Context) {
companion object {
private const val PREF_NAME = "app_preferences"
private const val KEY_THEME = "theme_mode"
const val THEME_LIGHT = "light"
const val THEME_DARK = "dark"
const val THEME_SYSTEM = "system"
}
private val prefs = context
.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
fun getTheme(): String =
prefs.getString(KEY_THEME, THEME_SYSTEM) ?: THEME_SYSTEM
fun setTheme(theme: String) {
prefs.edit { putString(KEY_THEME, theme) }
}
fun observeTheme(callback: (String) -> Unit) {
prefs.registerOnSharedPreferenceChangeListener { _, key ->
if (key == KEY_THEME) {
callback.invoke(getTheme())
}
}
}
}
Activity या Fragment में, ThemePreferences इंस्टेंस प्राप्त करना ऐप कॉन्टेक्स्ट के माध्यम से किया जाता है। इनिशियलाइज़ेशन पर, वर्तमान थीम सेट करने के लिए getTheme कॉल किया जाता है। जब उपयोगकर्ता नई थीम चुनता है, तो setTheme कॉल किया जाता है, और observeTheme के माध्यम से Activity को पुनरारंभ किए बिना इंटरफ़ेस अपडेट हो जाता है। मेमोरी लीक को रोकने के लिए onDestroy में listener से अनसब्सक्राइब करना महत्वपूर्ण है, खासकर यदि कॉन्फ़िगरेशन बदलने पर Activity पुनः बनाई जाती है।
न्यूनतम लक्ष्य संस्करण Android 12+ वाले ऐप्स के लिए, LifecycleObserver के साथ registerOnSharedPreferenceChangeListener का उपयोग करने की सलाह दी जाती है। यह कॉम्पोनेंट के जीवनचक्र बदलने पर स्वचालित रूप से सब्सक्रिप्शन और अनसब्सक्रिप्शन प्रबंधित करता है। पुराने संस्करणों के लिए, सब्सक्रिप्शन और अनसब्सक्रिप्शन मैन्युअल रूप से प्रबंधित करना होता है, जो SharedPreferences का उपयोग करने वाले प्रोडक्शन ऐप्स में त्रुटियों का एक सामान्य स्रोत है।
अक्सर पूछे जाने वाले प्रश्न
SharedPreferences सीधे केवल प्रिमिटिव टाइप और Set<String> का समर्थन करता है। ऑब्जेक्ट संग्रहीत करने के लिए, आपको उन्हें Gson या Moshi के माध्यम से JSON स्ट्रिंग में सीरियलाइज़ करना होगा, putString के माध्यम से सहेजना होगा, और पढ़ते समय डीसीरियलाइज़ करना होगा। कई फ़ील्ड वाले जटिल ऑब्जेक्ट के लिए, JSON सीरियलाइज़ेशन के साथ SharedPreferences के बजाय Room का उपयोग करने की सलाह दी जाती है।
हाँ, SharedPreferences थ्रेड-सेफ है। सभी रीड और राइट ऑपरेशन SharedPreferences ऑब्जेक्ट और इसके Editor स्तर पर सिंक्रोनाइज़ होते हैं। हालांकि, मल्टी-प्रोसेस मोड का उपयोग करते समय सिंक्रोनाइज़ेशन की गारंटी नहीं है। एक ऐप के अंदर कई थ्रेड से समवर्ती पहुँच के लिए, SharedPreferences अतिरिक्त लॉक के बिना सुरक्षित है।
SharedPreferences से सभी डेटा पूरी तरह साफ़ करने के लिए, Editor पर clear() विधि कॉल करें और apply के माध्यम से परिवर्तन लागू करें। यदि आपको XML फ़ाइल को ही हटाना है, तो कॉन्टेक्स्ट पर deleteSharedPreferences(name) का उपयोग करें। सेटिंग्स → ऐप्स → डेटा साफ़ करें के माध्यम से ऐप डेटा साफ़ करने से भी सभी SharedPreferences फ़ाइलें हट जाती हैं।
नए प्रोजेक्ट्स के लिए, Google SharedPreferences के विकल्प के रूप में DataStore की सलाह देता है। DataStore कोरूटीन के साथ एसिंक्रोनस संचालन, टाइप सुरक्षा (Proto DataStore) और स्वचालित माइग्रेशन प्रदान करता है। SharedPreferences केवल API 14 से नीचे न्यूनतम संस्करण वाले प्रोजेक्ट्स के लिए या जब अतिरिक्त निर्भरता के बिना तेज़ एकीकरण आवश्यक हो, चुनना चाहिए।
डेटा एन्क्रिप्शन के लिए, AndroidX Security लाइब्रेरी से EncryptedSharedPreferences का उपयोग करें। यह AES-256 GCM के साथ स्वचालित रूप से कुंजियों और मानों को एन्क्रिप्ट करता है। सेटअप प्रक्रिया न्यूनतम है: getSharedPreferences को Android Keystore से मास्टर कुंजी निर्दिष्ट करते हुए EncryptedSharedPreferences.create से बदल दिया जाता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें