onStop — Androidda Activity hayot siklidagi metod bo'lib, tizim tomonidan Activity foydalanuvchiga ko'rinmay qolganda chaqiriladi. Activity yangi Activity uni to'liq yopgandan so'ng yoki ilova minimallashtirilganda Stopped holatiga o'tadi. onStop metodida ishlab chiquvchi animatsiyalarni to'xtatishi, kamera va sensorlar resurslarini bo'shatishi, kiritilgan ma'lumotlarning qoralamalarini saqlashi shart. Android Vitals (Google, 2025) ma'lumotlariga ko'ra, onStopni to'g'ri ishlash ilovani minimallashtirishda ANR (Application Not Responding) sonini 35% ga kamaytiradi. onStopdan so'ng tizim onRestart (ekranga qaytish) yoki onDestroy (to'liq tugatish) ni chaqirishi mumkin. Android Developers-ning Activity hayot sikli haqidagi hujjatlari onStopni ko'rinadigan va ko'rinmaydigan holat o'rtasidagi chegara sifatida tasvirlaydi.
Asosiy fikrlar
onStop — AppCompatActivity sinfi (va uning o'tmishdoshi Activity) ning callback metodi bo'lib, Android operatsion tizimi tomonidan Activity foydalanuvchi uchun to'liq ko'rinmas holga kelganda chaqiriladi. Shu paytda Activity boshqa Activity, dialog oynasi, tizim ishga tushirgichi yoki blokirovka ekrani tomonidan yashirilgan. Hayot sikli nuqtai nazaridan, onStop onPausedan keyin keladi va Activity endi ekranda ko'rinmasligini bildiradi, garchi Activity obyekti va uning holati xotirada qolsa.
Activity Stopped (to'xtatilgan) holatiga o'tganda, u o'z holatini operativ xotirada saqlaydi — barcha maydonlar, View iyerarxiyasi va ViewModel mavjud bo'lib qoladi. Bu Stoppedni yo'q qilingan (Destroyed) holatdan farqlaydi, bunda Activity butunlay o'chiriladi. System UI xotira yetishmasligida Stopped holatidagi ilova jarayonini o'ldirishi mumkin — bu process death deb ataladi. Ishlab chiquvchi kritik ma'lumotlarni (qoralamalar, aylantirish pozitsiyasi) onStopdan oldin chaqiriladigan onSaveInstanceState() da saqlashi shart, bu jarayon o'ldirilganda tiklanishni kafolatlaydi.
Android Compatibility Definition Document (CDD) 14+ versiyasi spetsifikatsiyasiga ko'ra, Stopped holatidagi jarayon OOM Killer tomonidan o'ldirishda past ustuvorlikka ega — Background fazasidagi jarayonlardan past, lekin keshlangan jarayonlardan yuqori. Google statistikasiga ko'ra, jarayonlarni o'ldirishning 68% hollari Activity Stopped holatida bo'lganda sodir bo'ladi, Paused emas.
onStop Activityning to'liq ko'rinmasligida chaqiriladi, sababidan qat'i nazar: joriy Activity ustida yangi Activityni ishga tushirish, ilovani minimallashtirish (Home tugmasi), ekranni bloklash, kiruvchi qo'ng'iroq yoki tizim dialogini ochish. Barcha bu hollarda Activity avval onPause (qisman fokus yo'qotilishi), keyin onStop (to'liq ko'rinmaslik) oladi.
onStopni chaqirishning asosiy stsenariylari:
Muhim: onStop chaqirilmaydi ekran aylantirilganda — bu holda Activity yo'q qilinadi (onPause → onStop → onDestroy) va qayta yaratiladi (onCreate → onStart → onResume). Istisno — manifestdagi android:configChanges="orientation" flagi, bunda Activity qayta yaratilmaydi, balki onConfigurationChanged() chaqirig'ini oladi.
onStop Activity hayot sikli ketma-ketligida markaziy o'rinni egallaydi — ko'rinadigan va ko'rinmaydigan holat o'rtasida. To'liq ketma-ketlik: onCreate → onStart → onResume → (faol holat) → onPause → onStop → onDestroy (yoki qaytishda onRestart → onStart → onResume).
| Holat | Metod | Ko'rinish | Aloqa | Xotira |
|---|---|---|---|---|
| Created | onCreate | Yo'q | Yo'q | Ajratiladi |
| Started | onStart | Qisman | Yo'q | To'liq |
| Resumed | onResume | To'liq | Ha | To'liq |
| Paused | onPause | Qisman | Yo'q | To'liq |
| Stopped | onStop | Yo'q | Yo'q | To'liq* |
| Destroyed | onDestroy | Yo'q | Yo'q | Bo'shatilgan |
*Stopped holatida Activity xotirada saqlanadi, lekin resurs yetishmasligida tizim tomonidan o'ldirilishi mumkin. Stopped jarayonlarini o'ldirish ustuvorligi — oxirgidan oldingi, faqat bo'sh keshlangan jarayonlardan yuqori.
onStop va onSaveInstanceState: Tizim UI dinamik holatini saqlash uchun onStopdan oldin onSaveInstanceState(Bundle) ni chaqiradi. Ishlab chiquvchi bu metodni Bundlega kiritish maydonlari qiymatlarini, RecyclerView pozitsiyasini, tanlangan elementlarni saqlash uchun qayta belgilaydi. Activity yo'q qilinmasa ham (foydalanuvchi shunchaki minimallashtirib qaytgan bo'lsa), Bundle konfiguratsiya o'zgarishlarida onCreate ga uzatiladi. Google faqat o'tkinchi UI holatini saqlashni tavsiya qiladi — Activity tashqarisida yashaydigan repository yoki ViewModel ma'lumotlarini emas.
onStopda ishlab chiquvchi Activity ko'rinmas bo'lganda kerak bo'lmagan barcha resurslarni bo'shatishi shart. Bu batareya, protsessor va xotira yukini kamaytiradi, shuningdek faollikka qaytishda ANRning oldini oladi.
onStopda nimani bo'shatish kerak:
onStopda nima qilmaslik kerak: Uzoq muddatli operatsiyalarni bajarmang — katta ma'lumotlarni ma'lumotlar bazasida saqlash, tarmoq so'rovlari, murakkab hisob-kitoblar. onStop asosiy oqimda bajariladi va Activityga qaytishni bloklaydi. Uzoq muddatli operatsiyalar uchun kechikish bilan WorkManager yoki viewModelScope dagi koroutinlardan foydalaning. ViewModel resurslarini bo'shatmang — ViewModel onStopdan omon qoladi va qaytishda ishlatiladi.
onPause va onStop ko'rinish yo'qotilishi darajasi va majburiy harakatlar hajmi bilan farqlanadi. onPause qisman fokus yo'qotilishida chaqiriladi (masalan, dialog oynasi yoki tizim menyusi ochilishi), onStop — to'liq ko'rinmaslikda. Bu farq har bir bosqichda qanday resurslarni bo'shatishni tanlash uchun muhimdir.
| Xususiyat | onPause | onStop |
|---|---|---|
| Ko'rinish darajasi | Qisman ko'rinadi | To'liq ko'rinmaydi |
| Fokus | Yo'qotilgan | Yo'qotilgan |
| Bajarilish vaqti | 500 ms gacha | 5 s gacha (ANR vaqt chegarasi) |
| Bo'shatiladigan resurslar | Kritik (media, kamera) | Barcha ko'rinmaydigan (sensorlar, animatsiyalar, location) |
| Tiklanish | onResume | onRestart → onStart → onResume |
| Jarayon ustuvorligi | Yuqori (Foreground) | O'rta (Background) |
Umumiy qoida: onPause da boshqa ilovaning foydalanuvchi tajribasiga darhol ta'sir qiladigan tizim resurslarini (kamera, mediapleer) bo'shating, onStop da — yashirin Activityda kerak bo'lmagan barcha qolgan resurslarni. Google onPause da kritik foydalanuvchi ma'lumotlarini (elektron pochta qoralamasi, sozlamalar) saqlashni tavsiya qiladi, chunki tez almashishda onStop kelmasligi mumkin.
Foydalanuvchi yashirilgan Activityga qaytganda, tizim onRestart → onStart → onResume ni chaqiradi. onRestart metodi Activity Stopped holatidan qaytayotganini bildiradi. Bu onStopda bo'shatilgan UI va resurslarni tiklash uchun muhim bosqichdir.
Qaytishda chaqiruvlar ketma-ketligi:
Agar ilova jarayoni Stopped holatida tizim tomonidan o'ldirilgan bo'lsa, onRestart o'rniga onCreate chaqiriladi va onSaveInstanceState dan Bundle holatni tiklash uchun uzatiladi. Bu stsenariy (process death) — Android ilovalaridagi eng keng tarqalgan xatolardan biri: ishlab chiquvchilar onRestartni amalga oshiradilar, lekin jarayon o'ldirilgandan so'ng onCreate orqali tiklanishni hisobga olmaydilar.
Activity yashiringanda sensorlardan to'g'ri chiqish va animatsiyani to'xtatishni ko'rsatadi. Ekranga qaytganidan so'ng resurslar onStartda tiklanadi.
class MainActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null
private var rotationAnimator: ObjectAnimator? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
override fun onStart() {
super.onStart()
accelerometer?.let {
sensorManager.registerListener(sensorListener, it, SensorManager.SENSOR_DELAY_NORMAL)
}
rotationAnimator = ObjectAnimator.ofFloat(findViewById(R.id.icon), "rotation", 0f, 360f)
rotationAnimator?.apply {
duration = 3000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
start()
}
}
override fun onStop() {
super.onStop()
sensorManager.unregisterListener(sensorListener)
rotationAnimator?.cancel()
}
override fun onRestart() {
super.onRestart()
Log.d("MainActivity", "Activity Stopped holatidan qaytadi")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Accel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
Kod akselerometr sensorini ro'yxatga oladi va onStartda cheksiz aylanish animatsiyasini ishga tushiradi. onStopda sensor o'chiriladi va animatsiya bekor qilinadi — bu yashirin Activityda batareya sarfini oldini oladi. onRestart → onStart orqali qaytgandan so'ng resurslar qayta yaratiladi.
ViewModel + SavedStateHandle dan foydalanadigan zamonaviy yondashuv. Forma ma'lumotlari qo'lda Bundle holda onStopda avtomatik saqlanadi.
class FormViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var email: String
get() = savedStateHandle["email"] ?: ""
set(value) { savedStateHandle["email"] = value }
var message: String
get() = savedStateHandle["message"] ?: ""
set(value) { savedStateHandle["message"] = value }
}
class FormActivity : AppCompatActivity() {
private val viewModel: FormViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_form)
Log.d("FormActivity", "onCreate: email=${viewModel.email}")
}
override fun onStop() {
super.onStop()
Log.d("FormActivity", "onStop: ma'lumotlar SavedStateHandle da saqlandi")
}
}
SavedStateHandle onSaveInstanceState vaqtida qiymatlarni avtomatik Bundle da saqlaydi, bu onStopdan oldin chaqiriladi. Ekran aylantirilganda yoki jarayon o'ldirilganda ma'lumotlar yo'qotilmasdan tiklanadi. Google to'g'ridan-to'g'ri onSaveInstanceState o'rniga formalar va qoralamalar uchun SavedStateHandle ni tavsiya qiladi.
onStopga o'tishda asinxron ma'lumot saqlash uchun koroutinlar bilan lifecycleScope dan foydalanish. Koroutina IO dispetcherida ishga tushiriladi, asosiy oqimni bloklamaydi.
class NoteActivity : AppCompatActivity() {
private val noteRepository = NoteRepository()
override fun onStop() {
lifecycleScope.launch(Dispatchers.IO) {
val text = findViewById<EditText>(R.id.note_content).text.toString()
noteRepository.saveDraft(text)
withContext(Dispatchers.Main) {
Log.d("NoteActivity", "Qoralama onStop da saqlandi")
}
}
super.onStop()
}
}
lifecycleScope.launch koroutinasi Activity hayot sikli tugasa avtomatik bekor qilinadi. Dispatchers.IO dan foydalanish ma'lumotlar bazasiga yoki faylga yozish Activityga qaytishni bloklamasligini kafolatlaydi. Google ma'lumotlariga ko'ra, lifecycleScope dagi koroutinlar onStopda asinxron operatsiyalar uchun afzal qilingan usuldir.
Tez-tez so'raladigan savollar
onStop — Activity ko'rinmas bo'ladi, lekin xotirada Stopped holatida qoladi. Tizim Activityni onRestart orqali qaytarishi mumkin. onDestroy — Activity yo'q qilinadi, xotira bo'shatiladi. onDestroy dan so'ng qaytish faqat Activityning yangi namunasini yaratish orqali mumkin (onCreate).
Ha, majburiy. super.onStop() tizim komponentlarining to'g'ri ishlashini ta'minlaydi: fragmentlar, LoaderManager, ViewModelStore. super.onStop() ni o'tkazib yuborish xotira oqishlari va fragmentlarning noto'g'ri tiklanishiga olib kelishi mumkin. Har doim super.onStop() ni oxirgi yoki birinchi chaqiring — tartib muhim emas, lekin chaqiruv majburiydir.
Hayot siklining har bir metodida Log.d yoki Timber dan foydalaning. Activity-ning tagi bilan logcat filtrini yoqing. Ishlab chiqarish uchun Android Vitals dan foydalaning — Google avtomatik hayot sikli metrikalarini to'playdi va Play Console da anomaliyalarni ko'rsatadi. Shuningdek ProcessLifecycleOwner orqali hayot sikli monitoringi mavjud.
onStop da ushlanmagan istisno ilovaning Force Close bo'lishiga sabab bo'ladi. Tizim hayot sikli callbacklarida istisnolarni ushlamaydi. Agar onStop da istisno tashlashi mumkin bo'lgan operatsiyalar (fayllar bilan ishlash, tarmoq) bajarilsa, ularni try-catch bilan o'rab oling va super.onStop() bajarilishini to'xtatmasdan xatoni qayd eting.
Yo'q, Activity dagi Bitmap unga havola bo'lmasa GC tomonidan yig'iladi. onStop da majburiy bo'shatish (recycle()) talab qilinmaydi va hatto zararli — Activity onRestart orqali qaytsa, Bitmap qayta yuklanishi kerak bo'ladi. Tasvirlarni yuklash uchun Glide yoki Coil dan foydalaning — bu kutubxonalar avtomatik keshlash va hayot siklini boshqaradi.
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.