onPause: bu nima, Android-da Activity holatini saqlash

Muallif: IT Sectr Nashr etilgan: 2026-03-04 O'qish vaqti: 10 daq

onPause — Android hayot siklining metodi bo'lib, Activity kiritish fokusini yo'qotganda, lekin ekranda qisman ko'rinadigan bo'lib qolganda chaqiriladi. Sistem onPause-ni yangi Activity oldingi planga chiqishidan oldin, dialog oynasi ochilganda, “So'nggi ilovalar” tugmasi bosilganda yoki qo'ng'iroq kelganda chaqiradi. Bu metod — foydalanuvchi ma'lumotlarini saqlash uchun oxirgi kafolatlangan nuqta, chunki onStop va onDestroy-dan keyin sistem qo'shimcha chaqiruvlarsiz jarayonni tugatishi mumkin. onPause ichida dasturchi qoralamalarni saqlaydi, animatsiyalarni to'xtatadi, kamerani bo'shatadi va joriy UI holatini SharedPreferences-ga yozadi. Activity-ning to'liq hayot sikli haqida Activity Lifecycle maqolasida o'qing.

Asosiy

  • onPause — Activity fokusni yo'qotadi, lekin ko'rinadigan bo'lib qoladi; ma'lumotlarni saqlash uchun oxirgi kafolatlangan nuqta
  • Holatni saqlash — onPause-da foydalanuvchining kritik ma'lumotlari saqlanadi: qoralamalar, formadagi matn, taraqqiyot
  • Resurslarni bo'shatish — kamera, mikrofon, video pleer onPause-da boshqa ilovaga berish uchun bo'shatiladi
  • Vaqt chegarasi — onPause 100 ms ichida tugashi kerak; oshib ketish ANRga sabab bo'ladi va o'tishni kechiktiradi
  • SharedPreferences.apply() — onPause-da asinxron yozish; commit() oqimni bloklaydi va ANRga sabab bo'lishi mumkin
  • onPause vs onStop — onPause qisman ko'rinishda (dialog), onStop to'liq yashirishda (boshqa Activity)
  • onSaveInstanceState — Bundle-da vaqtinchalik holatni saqlash uchun onPause-dan keyin chaqiriladi

Android-da onPause nima

onPause — Activity hayot siklining to'rtinchi metodi bo'lib, ekran kiritish fokusini yo'qotganda, lekin foydalanuvchi uchun qisman ko'rinadigan bo'lib qolganda chaqiriladi. Bu ilovaning faol ishi va uning yashirilishi o'rtasidagi “otish” holatidir. Sistem onPause-ni quyidagi stsenariylarda chaqiradi: boshqa Activity ochilishi (yangi ekran joriy ekranni yopadi), dialog oynasining paydo bo'lishi (Dialog, PopupWindow, Snackbar onPause chaqirmaydi, DialogFragment esa chaqiradi), “So'nggi ilovalar” tugmasi bosilishi, qo'ng'iroq kelishi, ekranni bloklash uchun “Quvvat” tugmasi bosilishi.

onPause-ning asosiy vazifasi ilovani yashirilishi yoki yo'q qilinishi mumkin bo'lgan holatga tayyorlashdir. Bu hayot siklidagi oxirgi nuqta bo'lib, dasturchi uning kodi sistem boshqa komponentga o'tishdan oldin bajarilishiga ishonch hosil qilishi mumkin. onPause-dan keyin sistem onStop-ni chaqiradi (agar Activity to'liq yashirilsa), undan keyin jarayonning yo'q qilinishi qo'shimcha bildirishnomalarsiz istalgan vaqtda sodir bo'lishi mumkin.

Android Developers (2025) hujjatlariga ko'ra, onPause maksimal yengil va tez bo'lishi kerak. onPause boshqaruvni qaytarmaguncha, sistem keyingi Activity-ni ishga tushira olmaydi — bu foydalanuvchi ekranlar o'rtasida kechikishni ko'rishini anglatadi. Google onPause-ni 100 millisekunddan kamroq vaqtda tugatishni va barcha uzoq muddatli operatsiyalarni (ma'lumotlar bazasiga yozish, diskka yozish) korutinlar yoki apply() orqali asinxron bajarishni tavsiya qiladi.

Activity-da onPause

Activity-da onPause metodi har safar ekran faol bo'lishni to'xtatganda, lekin qisman ko'rsatilishda davom eta olsa chaqiriladi. Oddiy misol: foydalanuvchi “Xaritalar” ilovasini ochadi, “Joylashuvni ulashish” tugmasini bosadi va Xaritalar ustida sistem ilova tanlash dialogi ochiladi. Xaritalar Activity-si onPause oladi, lekin dialog ostida ko'rinadigan bo'lib qoladi. Dialog yopilganda, Xaritalar onStart chaqirilmasdan onResume oladi (ekran to'liq yashirilmagan edi).

kotlin
class NoteEditorActivity : AppCompatActivity() {
    private var binding: ActivityNoteEditorBinding? = null
    private val prefs by lazy {
        getSharedPreferences("note_drafts", Context.MODE_PRIVATE)
    }

    override fun onPause() {
        super.onPause()

        // Qoralamani saqlaymiz — asinxron
        prefs.edit()
            .putString("draft_title", binding?.titleInput?.text.toString())
            .putString("draft_body", binding?.bodyInput?.text.toString())
            .putLong("draft_timestamp", System.currentTimeMillis())
            .apply()

        // Videoni to'xtatamiz
        binding?.videoPlayer?.pause()

        // Eksklyuziv resurslarni bo'shatamiz
        releaseCamera()
        releaseAudioFocus()
    }

    override fun onResume() {
        super.onResume()
        // Qoralamani tiklaymiz
        binding?.titleInput?.setText(prefs.getString("draft_title", ""))
        binding?.bodyInput?.setText(prefs.getString("draft_body", ""))
        acquireCamera()
        acquireAudioFocus()
    }
}

NoteEditorActivity misoli onPause bilan to'g'ri ishlashni namoyish etadi: SharedPreferences-da apply() orqali qoralamani saqlash, video faylini to'xtatish, kamera va audio fokusni bo'shatish. Har bir chaqiruv yengil va tez, UI oqimini ANR uchun yetarli darajada bloklamaydi. Tartibga e'tibor bering: super.onPause() birinchi qatorda chaqiriladi — bu foydalanuvchi kodida istisno bo'lsa ham sistem mantiqining bajarilishini kafolatlaydi.

onPause-da holatni saqlash

onPause — dasturchi ilova yashirilishidan yoki sistem tomonidan o'ldirilishidan oldin foydalanuvchi ma'lumotlarini kafolatli saqlay oladigan oxirgi nuqtadir. onStop-dan keyin sistem xotira yetishmasligida onDestroy chaqirmasdan jarayonni yo'q qilishi mumkin. onSaveInstanceState() metodi onPause-dan keyin chaqiriladi, lekin uning Bundle-i uzoq muddatli saqlash uchun mo'ljallanmagan — faqat keyingi onCreate-ga qadar yashaydi.

SharedPreferences apply() bilan

Asinxron apply() bilan SharedPreferences — onPause-da kichik hajmdagi ma'lumotlarni saqlashning optimal usulidir. commit() bilan solishtirganda, sinxron ravishda diskka yozadigan va boolean qaytaradigan, apply() darhol xotiraga saqlaydi va diskka asinxron yozishni rejalashtiradi. Bu commit()-ning 10–100 millisekundiga nisbatan UI oqimida 1 millisekunddan kam vaqt oladi.

kotlin
override fun onPause() {
    super.onPause()

    // ❌ Yomon: sinxron yozish oqimni bloklaydi
    // prefs.edit().putInt("score", score).commit()

    // ✅ Yaxshi: asinxron yozish
    prefs.edit().putInt("score", score).apply()

    // Murakkab obyektlar uchun — ViewModel-da keshlash
    viewModel.saveState()
}

Room va korutinlar

Strukturalashtirilgan ma'lumotlar uchun (Room orqali SQLite) onPause-da lifecycleScope bilan korutinlardan foydalaniladi. ViewModelScope ViewModel yo'q qilinganda korutinni avtomatik bekor qiladi, bu yopiq ma'lumotlar bazasiga yozishning oldini oladi. Room bilan korutinlar orqali yozish 5–15 millisekund davom etadi va UI oqimini bloklamaydi.

kotlin
// ViewModel-da:
fun saveDraft(title: String, body: String) {
    viewModelScope.launch(Dispatchers.IO) {
        noteDao.insert(NoteDraft(title = title, body = body))
    }
}

// Activity.onPause-da:
viewModel.saveDraft(
    binding?.titleInput?.text.toString(),
    binding?.bodyInput?.text.toString()
)

Fragment-da onPause

Fragment-da onPause Fragment faol bo'lishni to'xtatganda, lekin ko'rinadigan bo'lib qolishi mumkin bo'lganda chaqiriladi. Bu quyidagi hollarda sodir bo'ladi: Fragment FragmentTransaction orqali boshqa Fragment bilan almashtirilganda; Fragment ViewPager-da joriy sahifa bo'lishni to'xtatganda; Fragmentni o'z ichiga olgan Activity onPause olganda. Activity-ning onPause-i va Fragment-ning onPause-i o'rtasidagi o'zaro ta'sir qat'iy ierarxik: avval onPause-ni Activity oladi, keyin uning barcha Fragmentlari.

kotlin
class MapFragment : Fragment() {
    private var mapController: MapController? = null

    override fun onPause() {
        super.onPause()
        mapController?.stopFollowMode()
        binding?.mapContainer?.alpha = 0.7f
    }

    override fun onResume() {
        super.onResume()
        binding?.mapContainer?.alpha = 1.0f
        if (isVisible) {
            mapController?.startFollowMode()
        }
    }
}

Xaritalar bilan onPause-da ishlashning o'ziga xosligi: Google Maps va Yandex Maps faol kuzatish rejimida (follow mode) sezilarli GPU resurslarini iste'mol qiladi. Fokus yo'qotilganda xarita animatsiyasini o'chirish va markerlarni yangilash chastotasini kamaytirish, fokus qaytganda esa to'liq funksionallikni tiklash mantiqan to'g'ri. Bu ekranlar o'rtasida almashishda unumdorlikni yaxshilaydi va energiya sarfini kamaytiradi.

onPause vs onStop: farq va stsenariylar

Boshlang'ich Android dasturchilari orasida eng ko'p chalkashlik — onPause va onStop o'rtasidagi farqni tushunmaslikdir. Keling, har bir stsenariyni ko'rib chiqaylik va to'g'ri metodni aniqlaymiz.

StsenariyonPauseonStop
Dialog oynasini ochishChaqiriladiChaqirilmaydi
Yangi Activity ochish (shaffof emas)ChaqiriladiChaqiriladi
“Uy” tugmasini bosishChaqiriladiChaqiriladi
Ekranni bloklashChaqiriladiChaqiriladi
Qo'ng'iroq kelishiChaqiriladiChaqiriladi
Joriy ustida shaffof ActivityChaqiriladiChaqirilmaydi
Split Screen (ekran yarmi)ChaqiriladiChaqirilmaydi
PiP (Picture-in-Picture)ChaqiriladiChaqirilmaydi

Asosiy qoida: onPause har bir fokus yo'qotilishida chaqiriladi, onStop — faqat to'liq ko'rinmaslikda. Activity ko'rinadigan bo'lib qolsa (hatto qisman), onStop chaqirilmaydi. Bu Split Screen, PiP va shaffof Activity rejimlari uchun juda muhim — bu yerda onPause/onResume ishlaydi, onStart/onStop esa ishlamaydi.

onPause vaqti va unumdorligi

onPause — hayot siklidagi vaqt bo'yicha eng muhim metod, chunki u keyingi Activity-ning renderlanishini bloklaydi. Sistem yangi Activity-ni ko'rsatishdan oldin joriy Activity-ning onPause tugashini kutadi. onPause 100 millisekunddan ortiq davom etsa, foydalanuvchi o'tish kechikishini sezadi; 5 soniyadan ortiq bo'lsa — sistem ANR ko'rsatadi.

Unumdorlik bo'yicha tavsiyalar

Google Android Performance Guide (2025) onPause uchun quyidagi tavsiyalarni beradi: tarmoq so'rovlarini bajarmang — ular bekor qilinishi yoki WorkManager-ga ko'chirilishi kerak; katta fayllarni diskka yozmang — fon oqimida BufferedWriter dan foydalaning; murakkab SQL so'rovlarini bajarmang — Room operatsiyalari korutinlar orqali asinxron bo'lishi kerak; yangi obyektlarni yaratishdan saqlaning — onPause-da garbage collection kechikishni yanada kuchaytiradi; SharedPreferences uchun commit() o'rniga apply() dan foydalaning.

kotlin
override fun onPause() {
    super.onPause()

    // ❌ Yomon: HTTP so'rovi UI-ni bloklaydi
    // val response = api.syncSave(data).execute()

    // ❌ Yomon: faylga sinxron yozish
    // FileOutputStream(file).write(data)

    // ✅ Yaxshi: asinxron saqlash
    lifecycleScope.launch {
        withContext(Dispatchers.IO) {
            api.saveData(data)
            fileDao.write(data)
        }
    }

    // ✅ Yaxshi: SharedPreferences-ga yengil yozish
    prefs.edit().putString("key", value).apply()
}

Android Studio Profiler (CPU grafigi) orqali onPause profillash aniq bajarilish vaqtini ko'rsatadi. onPause 100 ms dan ortiq davom etsa, Profiler metodni sariq, 500 ms dan ortiq bo'lsa — qizil rang bilan belgilaydi. IT Sectr tijorat loyihalarida Activity-lar o'rtasida o'tish vaqtini avtomatik tekshiradigan va CI pipeline-da unumdorlik regressiyasi haqida ogohlantiradigan Macrobenchmark testlaridan foydalanamiz.

onPause-da keng tarqalgan xatolar

Tajribali dasturchilar ham onPause-da xatolarga yo'l qo'yadi. Beshta tipik muammo va ularning yechimlarini ko'rib chiqaylik.

Ma'lumotlar bazasiga sinxron yozish

onPause-da sinxron so'rov bilan Room DAO chaqiruvi (.executeAsObservable() korutinsiz) UI oqimini 10–50 ms bloklaydi. Agar shu paytda GC yoki ma'lumotlar bazasiga yozish uchun raqobat bo'lsa, kechikish 200–500 ms ga yetishi mumkin. Yechim: Dispatchers.IO bilan korutinlar yoki SharedPreferences uchun apply() dan foydalaning.

Yangi tinglovchilarni ro'yxatdan o'tkazish

onPause tinglovchilarni ro'yxatdan o'tkazish uchun joy emas. Agar onPause-da BroadcastReceiver ro'yxatdan o'tkazilsa, Activity ko'rinmas bo'lganda ham faol qoladi. Ro'yxatdan o'tkazish faqat onStart/onResume-da, onPause/onStop-da esa faqat ro'yxatdan chiqarish bo'lishi kerak. Istisno — chaqirishdan oldin ro'yxatdan o'tishni talab qiladigan Intent-driven API-lardir.

Istisnolarni e'tiborsiz qoldirish

Agar onPause-da ishlov berilmagan istisno yuz bersa, sistem onStop va onDestroy chaqirmaydi. Activity noaniq holatda muzlab qoladi va qaytishda onResume bo'shatilgan resurslarni to'g'ri tiklay olmaydi. Yechim: muhim operatsiyalarni Log.e() bilan loglash bilan try/catch ichiga oling.

Ortiqcha ma'lumotlarni saqlash

onPause-da osonlikcha tiklanishi mumkin bo'lgan ma'lumotlarni saqlash shart emas. Masalan, API so'rovlari natijalari onPause-da emas, balki olingan paytda Room yoki DataStore-da keshlanadi. Faqat foydalanuvchi qo'lda kiritgan va avtomatik tiklay olmaydigan ma'lumotlarni saqlang — maydonlardagi matn, tanlangan elementlar, scroll holati.

super.onPause() unutilgan

super.onPause() chaqirilishi kerak, lekin onCreate-dan farqli o'laroq, uning yo'qligi darhol crashga sabab bo'lmaydi. Sistem onPause-da super-ni o'tkazib yuborishni “kechiradi”, lekin ichki holat mashinasi noto'g'ri holatga o'tadi. Keyingi onResume chaqiruvi kiritish fokusini tiklay olmaydi va Activity “muzlab” qoladi. Har doim super.onPause()-ni imkon qadar tezroq chaqiring.

Tez-tez beriladigan savollar

onPause-da finish() chaqirilsa nima bo'ladi?

onPause-da finish() chaqiruvi Activity-ni metod qaytganidan so'ng darhol tugatadi. Bu fokus yo'qotilganda ekranni yopish kerak bo'lsa (masalan, ilova minimallashtirilganda avtorizatsiya ekrani) to'g'ri stsenariydir. Biroq finish() to'liq tugatish siklini ishga tushiradi: onStop → onDestroy, bu o'tishga kechikish qo'shadi. finish()-ni onPause-da faqat haqiqatan zarur bo'lganda ishlating.

onPause onSaveInstanceState-dan nima bilan farq qiladi?

onPause — jarayon tugashidan keyin ham saqlanib qolishi kerak bo'lgan ma'lumotlarni saqlash uchun (SharedPreferences/Room-dagi qoralamalar). onSaveInstanceState — faqat keyingi onCreate-ga qadar kerak bo'lgan vaqtinchalik UI holatini saqlash uchun (scroll holati, tanlangan tab). onSaveInstanceState Bundle-i ilova to'liq tugatilganda saqlanmaydi — faqat xotirada mavjud. onPause ma'lumotlari diskda saqlanadi va qayta ishga tushirishdan omon qoladi.

onPause-da dialog oynasini ochish mumkinmi?

Tavsiya etilmaydi. onPause-da dialog yoki qalqib chiquvchi oynani ochish WindowLeakException-ga olib keladi, agar Activity allaqachon tugatilgan bo'lsa. Fokus yo'qotilganda bildirishnoma ko'rsatish kerak bo'lsa, NotificationManager (sistem bildirishnomalari) dan foydalaning — bu xavfsiz va foydalanuvchi uchun kutilgan. Kechiktirilgan harakatlar uchun AlarmManager yoki WorkManager dan foydalaning.

Nega onPause kafolatlangan saqlash joyi, onStop esa emas?

onPause Activity faol bo'lishni to'xtatishidan oldin kafolat bilan chaqiriladi. onStop chaqirilmasligi mumkin, agar sistem xotirani bo'shatish uchun jarayonni o'ldirsa — bu holda onDestroy ham chaqirilmaydi. onPause onResume-dan keyin har doim chaqiriladigan yagona metod, fokus yo'qotilishining sababidan qat'iy nazar. Shuning uchun barcha kritik ma'lumotlar aynan onPause-da saqlanadi.

onPause-ni unit testlarda qanday test qilish mumkin?

onPause-ni test qilish uchun AndroidX Test dan Robolectric yoki FragmentScenario ishlatiladi. FragmentScenario.create() → moveToState(State.STARTED) → moveToState(State.RESUMED) → moveToState(State.STARTED) ketma-ket onPause-ni chaqiradi. So'ngra ma'lumotlarning SharedPreferences-da saqlangani yoki kameraning mock-ob'yekt orqali bo'shatilgani tekshiriladi. Robolectric 4.12+ jismoniy qurilmasiz onPause/onResume emulyatsiyasini qo'llab-quvvatlaydi.

Xulosa

  • onPause — Activity kiritish fokusini yo'qotadi, lekin qisman ko'rinadigan bo'lib qoladi; ma'lumotlarni saqlash uchun oxirgi kafolatlangan nuqta
  • Saqlash — SharedPreferences.apply() yoki korutinlar orqali Room; commit() va sinxron operatsiyalar taqiqlangan
  • Resurslarni bo'shatish — kamera, audio fokus, video pleer onPause-da boshqa ilovaga berish uchun bo'shatiladi
  • 100 ms chegarasi — onPause keyingi Activity renderlanishini bloklaydi; chegaradan oshib ketish ANRga sabab bo'ladi
  • onPause vs onStop — onPause fokus yo'qotilishida (ko'rinish saqlanadi), onStop to'liq yashirishda
  • Fragment.onPause — Activity.onPause dan keyin ierarxik chaqiruv; xaritalar va ViewPager uchun xususiyat
  • Oddiy xatolar — sinxron yozish, tinglovchilarni ro'yxatdan o'tkazish, try/catch ni e'tiborsiz qoldirish, ortiqcha saqlash
  • super.onPause() — imkon qadar tezroq chaqiring; o'tkazib yuborish crashga sabab bo'lmaydi, lekin holat mashinasini buzadi

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