SharedPreferences: bu nima, Android kalit-qiymat ombori

Muallif: IT Sectr Nashr etilgan: 2026-03-12 O'qish vaqti: 9 daq

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 — XML faylida oddiy ilova sozlamalarini saqlash uchun Android kalit-qiymat ombori.
  • Besh turdagi ma'lumotni qo'llab-quvvatlaydi: String, Int, Boolean, Float, Long va Set<String>.
  • Yozish operatsiyalari uchun sinxron (get) va asinxron (apply) diskda saqlash bilan ishlaydi.
  • Ma'lumotlar fayl nomi va kirish rejimiga (PRIVATE, MULTI_PROCESS) ko'ra izolyatsiya qilinadi.
  • Katta hajmdagi ma'lumotlar uchun Google SharedPreferences o'rniga DataStore yoki Room dan foydalanishni tavsiya qiladi.

SharedPreferences nima?

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.

Saqlash formati: qurilmada XML

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 Android-da qanday ishlaydi

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.

Kirish rejimlari va kontekst

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.

kotlin
// 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 ning asosiy metodlari

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 metodiYozish metodiMa'lumot turi
getStringputStringString
getIntputIntInt
getBooleanputBooleanBoolean
getFloatputFloatFloat
getLongputLongLong
getStringSetputStringSetSet<String>

Editor va apply vs commit

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.

kotlin
// 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.

SharedPreferences va saqlash alternativlari

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.

YechimQachon foydalanish kerakKamchiliklari
SharedPreferencesKichik sozlamalar (100 kalitgacha)Tip xavfsizligi yo'q, sinxron o'qish
DataStoreKorutinlar bilan o'rta murakkablikdagi sozlamalarAPI 14 dan pastda orqaga moslik yo'q
RoomStrukturali ma'lumotlar va ro'yxatlar3–5 sozlama uchun haddan tashqari
EncryptedSharedPreferencesMaxfiy ma'lumotlar va tokenlarAndroidX Security ga bog'liqlik

DataStore — zamonaviy alternativ

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.

SharedPreferences dan ilovada foydalanish misoli

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.

Foydalanuvchi sozlamalarini saqlash

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.

kotlin
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 da obyektlarni saqlash mumkinmi?

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.

SharedPreferences thread-safe mi?

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 dagi barcha ma'lumotlarni qanday tozalash mumkin?

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.

SharedPreferences yoki DataStore: qaysi birini tanlash kerak?

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.

SharedPreferences da ma'lumotlarni qanday shifrlash mumkin?

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

  • SharedPreferences — XML formatida oddiy ilova sozlamalarini saqlash uchun Android-ga o'rnatilgan kalit-qiymat ombori.
  • Olti turdagi ma'lumotni qo'llab-quvvatlaydi: String, Int, Boolean, Float, Long va standart qiymat bilan Set<String>.
  • O'qish operatsiyalari xotiradan (kesh) bajariladi, yozish — sinxron commit yoki asinxron apply bilan Editor orqali.
  • Ma'lumotlar fayl nomi va MODE_PRIVATE rejimiga ko'ra izolyatsiya qilinadi, faqat yaratgan ilova ichida mavjud.
  • Maxfiy ma'lumotlarni saqlash uchun AES-256 shifrlash bilan EncryptedSharedPreferences dan foydalaning.
  • Yangi loyihalar uchun Google korutinlar va Flow bilan zamonaviy asinxron alternativ sifatida DataStore ni tavsiya qiladi.
  • SharedPreferences qo'shimcha bog'liqliklarsiz 5–50 oddiy sozlamani tez saqlash uchun eng yaxshi tanlov bo'lib qolmoqda.

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.

Loyihani muhokama qilish

Shuningdek o'qing