SharedPreferences Android پر ایک کلید-قدر ڈیٹا اسٹوریج ہے جو سادہ سیٹنگز اور ایپ کنفیگریشنز کو محفوظ کرنے کے لیے ڈیزائن کیا گیا ہے۔ ڈیٹا ڈیوائس پر XML فائل میں محفوظ ہوتا ہے اور صرف اس ایپ کے اندر قابل رسائی ہے جس نے اسے بنایا ہے۔ سرکاری دستاویزات کے مطابق Android Developers, 2025، SharedPreferences قدیمی اقسام: String، Int، Boolean، Float، Long اور Set<String> کی اسٹوریج کو سپورٹ کرتا ہے۔ یہ SQL سوالات یا فائل سسٹم کے ساتھ براہ راست کام کیے بغیر صارف کی تھوڑی مقدار میں سیٹنگز محفوظ کرنے کا سب سے آسان اور تیز ترین حل ہے۔
اہم نکات
SharedPreferences ڈیوائس کی اندرونی اسٹوریج میں XML فائل میں کلید-قدر جوڑے محفوظ کرنے کے لیے Android کا ایک بلٹ ان طریقہ کار ہے۔ یہ 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 کی حمایت کے ساتھ بہتر کیا گیا۔ یہ بھولے ہوئے سننے والوں سے منسلک میموری لیک سے بچنے میں مدد کرتا ہے۔ پرانے ورژنز میں، ڈویلپر کو جزو کے 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 (مشاہدہ) کے طریقے فراہم کرتی ہے۔ سیٹنگز فائل کا نام MODE_PRIVATE موڈ کے ساتھ “app_preferences” ہوگا۔ سہولت کے لیے، کلیدوں کو ایک ساتھی آبجیکٹ میں مستقل کے طور پر رکھا گیا ہے۔
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 میں سننے والے سے ان سبسکرائب کرنا ضروری ہے، خاص طور پر اگر کنفیگریشن تبدیلی پر 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں