SharedPreferences Android-da oddiy sozlamalar va ilova konfiguratsiyalarini saqlash uchun mo'ljallangan kalit-qiymat ma'lumotlar omboridir. Ma'lumotlar qurilmadagi XML faylida saqlanadi va faqat uni yaratgan ilova ichida mavjud. Rasmiy hujjatlarga ko'ra Android Developers, 2025, SharedPreferences primitive turlarni saqlashni qo'llab-quvvatlaydi: String, Int, Boolean, Float, Long va Set<String>. Bu SQL so'rovlari yoki fayl tizimi bilan to'g'ridan-to'g'ri ishlash zaruratisiz kichik hajmdagi foydalanuvchi sozlamalarini saqlash uchun eng oddiy va tez yechimdir.
Asosiy ma'lumotlar
SharedPreferences — qurilmaning ichki xotirasida XML faylida kalit-qiymat juftliklarini saqlash uchun Android-ga o'rnatilgan mexanizm. API Level 1 dan boshlab mavjud va qo'shimcha kutubxonalarni ulashni talab qilmaydi. Asosiy maqsad — foydalanuvchi sozlamalari, interfeys holati, first-launch bayroqlari va tuzilgan ma'lumotlar bazasini talab qilmaydigan boshqa oddiy ma'lumotlarni saqlash.
Har bir SharedPreferences fayli ma'lum bir nom va kirish rejimi bilan bog'langan. Odatiy holda Context.MODE_PRIVATE rejimi qo'llaniladi, bu faylga kirishni faqat joriy ilova bilan cheklaydi. Ilgari Android MODE_WORLD_READABLE va MODE_WORLD_WRITEABLE rejimlarini qo'llab-quvvatlagan, ammo ular API Level 17 dan boshlab eskirgan deb e'lon qilingan va Android 7.0 (API 24) da xavfsizlik sabablari bilan butunlay olib tashlangan.
Oddiyligiga qaramay, SharedPreferences millionlab Android ilovalarida qo'llaniladi. Google ma'lumotlariga ko'ra, Google Play da nashr etilgan ilovalarning 90% dan ortig'i sozlamalarni saqlash uchun SharedPreferences dan foydalanadi. Biroq, murakkab stsenariylar (katta hajmdagi ma'lumotlar, tip xavfsizligi, asinxronlik) uchun Google Android Jetpack kutubxonasidan Preferences DataStore kabi zamonaviyroq yechimlarni tavsiya qiladi.
Jismoniy jihatdan SharedPreferences ilova katalogidagi XML fayl shaklida saqlanadi: /data/data/{package_name}/shared_prefs/{file_name}.xml. Fayl saqlangan qiymat turiga qarab <string>, <int>, <boolean>, <float> va <long> bolaviy elementlari bilan <map> ildiz elementini o'z ichiga oladi. Fayl hajmi cheklanmagan, ammo katta hajmdagi ma'lumotlar uchun (100 KB dan ortiq) o'qish va yozish tezligi sezilarli darajada pasaya boshlaydi.
SharedPreferences fayllari odatiy holda shifrlanmaydi. Ma'lumotlar qurilmaning fayl tizimida ochiq holda saqlanadi. Maxfiy ma'lumotlarni (tokenlar, parollar) saqlash uchun AndroidX Security kutubxonasidan EncryptedSharedPreferences dan foydalanish tavsiya etiladi, u AES256-GCM yordamida kalitlar va qiymatlarni avtomatik shifrlaydi.
SharedPreferences davriy disk sinxronizatsiyasi bilan xotirada keshlash printsipi asosida ishlaydi. Faylga birinchi murojaatda (getSharedPreferences orqali) Android XML faylni operativ xotiraga yuklaydi va uni Map obyektiga pars qiladi. Barcha keyingi o'qish operatsiyalari diskdan qayta o'qilmasdan xotiradan bajariladi. Bu ma'lumotlarga yuqori tezlikda kirishni ta'minlaydi.
Yozish operatsiyalari Editor — ichki o'zgarishlar buferidan foydalanadi. Dasturchi putString yoki putBoolean ni chaqirganda, o'zgarishlar xotiradagi Editor obyektida saqlanadi. Diskka haqiqiy yozish commit (sinxron) yoki apply (asinxron) metodi chaqirilganda sodir bo'ladi. Bu metodlar chaqirilmaguncha ma'lumotlar saqlanmaydi va ilova to'satdan to'xtatilsa, o'zgarishlar yo'qolishi mumkin.
SharedPreferences namunasini olish uchun ikkita metod qo'llaniladi: getPreferences va getSharedPreferences. Birinchisi faqat Activity ichida mavjud va Activity nomi bilan fayl yaratadi. Ikkinchisi yanada moslashuvchan, fayl nomi va kirish rejimini qabul qiladi va istalgan kontekstdan (Application, Activity, Service) mavjud. Ilova moduli yoki funksionalligiga mos keladigan fayl nomi bilan getSharedPreferences dan foydalanish tavsiya etiladi.
// SharedPreferences olish
val prefs = context.getSharedPreferences(
"user_settings", Context.MODE_PRIVATE
)
// Ma'lumot yozish
with(prefs.edit()) {
putString("username", "Anna")
putInt("age", 28)
putBoolean("isLoggedIn", true)
apply()
}
// Ma'lumot o'qish
val username = prefs.getString("username", "")
val age = prefs.getInt("age", 0)
val isLoggedIn = prefs.getBoolean("isLoggedIn", false)
MODE_MULTI_PROCESS (eskirgan) dan foydalanganda SharedPreferences jarayonlar o'rtasida sinxronlashadi. Biroq, bu sinxronizatsiya atomiklikni kafolatlamaydi va Google multi-process stsenariylarida SharedPreferences dan foydalanishdan qochishni tavsiya qiladi. Bunday hollarda ContentProvider, jarayonlararo kirishga ega Room yoki DataStore dan foydalanish yaxshiroqdir.
SharedPreferences kalit bo'yicha ma'lumotlarni o'qish uchun metodlar to'plami va yozish uchun Editor interfeysini taqdim etadi. Har bir o'qish metodi ikkita parametr qabul qiladi: kalit va kalit topilmasa qaytariladigan standart qiymat. Standart qiymat shuningdek qaytariladigan qiymat turini ham aniqlaydi: getString String, getInt Int va hokazo qaytaradi.
| O'qish metodi | Yozish metodi | Ma'lumot turi |
|---|---|---|
| getString | putString | String |
| getInt | putInt | Int |
| getBoolean | putBoolean | Boolean |
| getFloat | putFloat | Float |
| getLong | putLong | Long |
| getStringSet | putStringSet | Set<String> |
Editor — buferda o'zgarishlarni to'playdigan SharedPreferences ning ichki obyekti. Barcha o'zgarishlar kiritilgandan so'ng, dasturchi commit() (sinxron yozish) yoki apply() (asinxron yozish) ni chaqiradi. Farq muhim: commit diskka to'liq yozish tugaguniga qadar joriy oqimni bloklaydi va boolean (muvaffaqiyat/muvaffaqiyatsizlik) qaytaradi, apply esa yozishni fon oqimida bajaradi va darhol boshqaruvni qaytaradi, ammo natijani qaytarmaydi.
Yozish natijasini bilish kerak bo'lmagan barcha hollarda apply dan commit o'rniga foydalanish tavsiya etiladi. apply tezroq va UI oqimini bloklamaydi. commit faqat ma'lumotlar muvaffaqiyatli saqlanganligini bilish muhim bo'lganda yoki multi-process rejimi bilan ishlashda qo'llanilishi kerak. Alohida kalitlarni o'chirish uchun remove metodi, to'liq tozalash uchun clear ishlatiladi. Barcha o'chirish operatsiyalari ham Editor orqali bajariladi.
// Ko'p o'zgarishlar - bitta apply
prefs.edit {
putString("theme", "dark")
putBoolean("notifications", false)
remove("old_key")
}
// Qiymat o'zgarish tinglovchisi
prefs.registerOnSharedPreferenceChangeListener { prefs, key ->
Log.d("TAG", "Kalit o'zgardi: $key")
}
Android 12 dan (API 31) boshlab, SharedPreferences Lifecycle orqali avtomatik obunani bekor qilish bilan registerOnSharedPreferenceChangeListener qo'llab-quvvatlashi bilan to'ldirilgan. Bu unutilgan tinglovchilar bilan bog'liq xotira oqishining oldini olishga imkon beradi. Eski versiyalarda dasturchi komponentning onDestroy yoki onStop da qo'lda unregisterOnSharedPreferenceChangeListener chaqirishi shart.
Keng tarqalganligiga qaramay, SharedPreferences Android-da barcha ma'lumot saqlash stsenariylari uchun universal yechim emas. Ma'lumotlar hajmi, tip xavfsizligi va ishlash talablariga qarab, Google Android Jetpack va standart Android kutubxonasiga kiritilgan turli alternativlarni tavsiya qiladi.
| Yechim | Qachon foydalanish kerak | Kamchiliklari |
|---|---|---|
| SharedPreferences | Kichik sozlamalar (100 kalitgacha) | Tip xavfsizligi yo'q, sinxron o'qish |
| DataStore | Korutinlar bilan o'rta murakkablikdagi sozlamalar | API 14 dan pastda orqaga moslik yo'q |
| Room | Strukturali ma'lumotlar va ro'yxatlar | 3–5 sozlama uchun haddan tashqari |
| EncryptedSharedPreferences | Maxfiy ma'lumotlar va tokenlar | AndroidX Security ga bog'liqlik |
DataStore — Google tomonidan SharedPreferences o'rnini bosuvchi sifatida taqdim etilgan Android Jetpack kutubxonasi. Ikki variantni taklif qiladi: Preferences DataStore (SharedPreferences kabi kalit-qiymat) va Proto DataStore (Protocol Buffers orqali tipli saqlash). DataStore asinxron ish uchun korutinlar va Flow dan foydalanadi, tip xavfsizligini kafolatlaydi va versiya migratsiyalarini avtomatik boshqaradi. Google barcha yangi loyihalar uchun DataStore ni tavsiya qiladi.
DataStore ning asosiy ustunligi — API darajasida asinxronlikdir. Barcha o'qish operatsiyalari Flow qaytaradi, yozish operatsiyalari esa suspend-funksiyalardir. Bu SharedPreferences ning sinxron o'qishida mumkin bo'lgan UI oqimining bloklanishini butunlay bartaraf qiladi. Bundan tashqari, DataStore ma'lumotlarning izchilligini kafolatlaydi: yozish tranzaksiyada bajariladi va nosozlik holda barcha o'zgarishlar qaytariladi.
Amaliy misolni ko'rib chiqaylik: Android ilovasida mavzu sozlamalari (yorug'/qorong'i/tizim). Foydalanuvchi mavzuni tanlaydi va tanlov SharedPreferences da saqlanadi. Ilovaning keyingi ishga tushirilishlarida mavzu saqlangan sozlamalardan tiklanadi. Interfeysni reaktiv yangilash uchun SharedPreferences.OnSharedPreferenceChangeListener orqali o'zgarishlarni kuzatish qo'llaniladi.
ThemePreferences klassini yaratamiz, u mavzu uchun SharedPreferences bilan barcha ishni inkapsulatsiya qiladi. Klass getTheme (o'qish), setTheme (yozish) va observeTheme (kuzatish) metodlarini taqdim etadi. Sozlamalar faylining nomi "app_preferences" MODE_PRIVATE rejimi bilan bo'ladi. Qulaylik uchun kalitlar companion object da doimiylar sifatida chiqarilgan.
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 yoki Fragment da ThemePreferences namunasini olish ilova konteksti orqali amalga oshiriladi. Initsializatsiya vaqtida joriy mavzuni o'rnatish uchun getTheme chaqiriladi. Foydalanuvchi yangi mavzuni tanlaganda setTheme chaqiriladi va observeTheme orqali interfeys Activity ni qayta ishga tushirmasdan yangilanadi. Xotira oqishining oldini olish uchun onDestroy da tinglovchidan obunani bekor qilishni unutmaslik muhim, ayniqsa Activity konfiguratsiya o'zgarishida qayta yaratilsa.
Minimal maqsadli versiyasi Android 12+ bo'lgan ilovalar uchun LifecycleObserver bilan birgalikda registerOnSharedPreferenceChangeListener dan foydalanish tavsiya etiladi. Bu komponentning hayot sikli o'zgarganda obuna va obunani bekor qilishni avtomatik boshqaradi. Eski versiyalar uchun obuna va obunani bekor qilish qo'lda boshqarilishi kerak, bu SharedPreferences dan foydalanuvchi ishlab chiqarish ilovalarida tez-tez xato manbai hisoblanadi.
Tez-tez so'raladigan savollar
SharedPreferences to'g'ridan-to'g'ri faqat primitive turlarni va Set<String> ni qo'llab-quvvatlaydi. Obyektlarni saqlash uchun ularni Gson yoki Moshi orqali JSON satriga seriyalash, putString bilan saqlash va o'qishda deseriyalash kerak. Ko'p sonli maydonlarga ega murakkab obyektlar uchun JSON-seriyalash bilan SharedPreferences o'rniga Room dan foydalanish tavsiya etiladi.
Ha, SharedPreferences thread-safe. Barcha o'qish va yozish operatsiyalari SharedPreferences obyekti va uning Editori darajasida sinxronlashtiriladi. Biroq, multi-process rejimidan foydalanganda sinxronizatsiya kafolatlanmaydi. Bitta ilova ichida bir nechta oqimdan raqobatli kirish uchun SharedPreferences qo'shimcha blokirovkalarsiz xavfsizdir.
SharedPreferences dan barcha ma'lumotlarni to'liq tozalash uchun Editor da clear() metodini chaqiring va o'zgarishlarni apply orqali qo'llang. XML faylining o'zini o'chirish kerak bo'lsa, kontekstda deleteSharedPreferences(name) dan foydalaning. Sozlamalar → Ilovalar → Ma'lumotlarni tozalash orqali ilova ma'lumotlarini tozalash ham barcha SharedPreferences fayllarini o'chiradi.
Yangi loyihalar uchun Google SharedPreferences o'rnini bosuvchi sifatida DataStore ni tavsiya qiladi. DataStore korutinlar bilan asinxron ishni, tip xavfsizligini (Proto DataStore) va avtomatik migratsiyalarni ta'minlaydi. SharedPreferences faqat minimal versiyasi API 14 dan past bo'lgan loyihalar yoki qo'shimcha bog'liqliklarsiz tez integratsiya zarur bo'lganda tanlanishi kerak.
Ma'lumotlarni shifrlash uchun AndroidX Security kutubxonasidan EncryptedSharedPreferences dan foydalaning. U AES-256 GCM yordamida kalitlar va qiymatlarni avtomatik shifrlaydi. O'rnatish jarayoni minimal: getSharedPreferences Android Keystore dan master-kalit ko'rsatilgan holda EncryptedSharedPreferences.create bilan almashtiriladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.