onDestroy — Android-da Activity va Fragment hayot siklining so'nggi metodi, komponent to'liq yo'q qilinishidan oldin chaqiriladi. onDestroy Activity yoki Fragment o'z ishini tugatayotganini bildiradi: barcha resurslar bo'shatilishi, ichki fragmentlar yo'q qilinishi, ViewModel tozalanishi kerak. Google ma'lumotlariga ko'ra, onDestroy Activity tugash holatlarining 100%ida chaqiriladi, lekin jarayonni o'ldirish (process death) paytida tizim onDestroy chaqiruvini butunlay o'tkazib yuborishi mumkin. Android-ning onDestroy haqidagi hujjatlari bu metod avariya tugashida chaqirilishiga kafolat bermasligini ta'kidlaydi.
Asosiy
onDestroy — Android Activity yoki Fragment ni yakuniy yo'q qilishdan oldin chaqiradigan qayta chaqiruv metodi. Bu resurslarni bo'shatish, fon operatsiyalarini bekor qilish va ma'lumotlar bilan ishni tugatish uchun dasturchining so'nggi imkoniyati. onDestroy bajarilgandan so'ng, Activity/Fragment namunasi axlat yig'uvchiga (GC) belgilanadi va endi ishlatilmaydi.
onDestroy chaqirilishining sabablari:
Google Android Vitals (2025) statistikasiga ko'ra, Activity yo'q qilish holatlarining taxminan 12%i ekran aylanishi, 65%i finish() va 23%i konfiguratsiya o'zgarishi sababidir. onDestroy ni o'tkazib yuborish bilan jarayonni o'ldirish foizi kam RAM-li (4 GB dan kam) qurilmalarga qarab taxminan 5–8% ni tashkil qiladi.
onDestroy ko'pgina standart stsenariylarda chaqiriladi, lekin dasturchi hisobga olishi kerak bo'lgan muhim istisnolar mavjud. onDestroy chaqiruvi kafolatlarini tushunish ilova arxitekturasi, ayniqsa ma'lumotlarni saqlash va WorkManager vazifalarini bekor qilish uchun muhimdir.
onDestroy qachon chaqiriladi:
onDestroy QACHON chaqirilmaydi:
onDestroy chaqiruvi kafolatining yo'qligi sababli Google tavsiya qiladi: muhim ma'lumotlarni saqlash uchun hech qachon onDestroy ga tayanmang. onSaveInstanceState(), WorkManager yoki avtomatik saqlash bilan Room dan foydalaning. onDestroy — resurslarni bo'shatish uchun, ma'lumotlarning doimiyligi uchun emas.
onDestroy ham Activity, ham Fragment uchun mavjud, lekin turli shartnomalar bilan. Fragmentning hayot sikli batafsilroq: onDestroy dan tashqari onDestroyView (View ierarxiyasini yo'q qilish) va onDetach (Activity dan ajratish) mavjud.
| Komponent | Yo'q qilish metodlari | Tartib | ViewModel omon qoladi |
|---|---|---|---|
| Activity | onDestroy | onPause → onStop → onDestroy | Yo'q (faqat ViewModelStore saqlanmasa) |
| Fragment | onDestroyView, onDestroy, onDetach | onPause → onStop → onDestroyView → onDestroy → onDetach | Ha, agar Fragment o'chirilmagan bo'lsa |
Asosiy farq: Fragmentda View Fragmentning o'zidan ko'ra tez-tez qayta yaratiladi. Ekran aylanishida Fragment onDestroyView (View ni yo'q qilish) orqali o'tadi, lekin Fragmentning o'zi va uning ViewModel i omon qoladi. onDestroyView — xotira oqishining oldini olish uchun View ga havolalarni tozalash uchun to'g'ri joy. Fragmentning onDestroy si — Activity ning onDestroy si bilan analog, Fragment to'liq olib tashlanganda chaqiriladi.
Ichki fragmentlar (child fragments) ota Fragment ning onDestroy sidan oldin yo'q qilinadi. Activity da bola fragmentlar ota Activity ning onDestroy si chaqirilganda onDestroy oladi. Tartib kafolatlangan: fragmentlar ularni o'z ichiga olgan Activity dan oldin tugaydi.
onDestroy Activity yoki Fragment dan uzoq yashamasligi kerak bo'lgan barcha resurslarni bo'shatish uchun mo'ljallangan. Qaytishgacha resurslarni bo'shatadigan onStop dan farqli o'laroq, onDestroy yakuniy tozalashni amalga oshiradi.
onDestroy da majburiy harakatlar ro'yxati:
onDestroy da NIMA QILMASLIK KERAK: Ma'lumotlarni onDestroy da saqlamang — onPause yoki onSaveInstanceState dan foydalaning. Yangi Service yoki WorkManager vazifalarini boshlamang — Activity yo'q qilinadi va natijani kuzata olmaysiz. UI ni yangilashga urinmang — View ierarxiyasi allaqachon yo'q qilingan yoki yo'q qilish jarayonida; findViewById() null qaytaradi.
ViewModel ekran aylanishida onDestroy Activity ni omon qolish uchun yaratilgan, lekin finish() da Activity bilan birga yo'q qilinadi. Bu asimmetrik xatti-harakat — dasturchilar orasida chalkashlikning asosiy sababi.
Ekran aylanishida:
finish() da (foydalanuvchi "Orqaga" tugmasini bosdi):
Shuning uchun onDestroy da viewModelScope ni bekor qilish kerak emas — ViewModel buni o'zi qiladi. Agar lifecycleScope (Activity ga bog'liq, ViewModel ga emas) dan foydalanayotgan bo'lsangiz, uni onDestroy da lifecycleScope.cancel() orqali bekor qiling yoki Job ni qo'lda boshqaring.
Activity da lifecycleScope ni to'g'ri boshqarishni ko'rsatadi: korutin tarmoq holatini kuzatish uchun ishga tushiriladi va onDestroy da bekor qilinadi.
class NetworkMonitorActivity : AppCompatActivity() {
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("NetworkMonitor", "Tarmoq mavjud")
}
override fun onLost(network: Network) {
Log.d("NetworkMonitor", "Tarmoq yo'qoldi")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_network)
val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerDefaultNetworkCallback(networkCallback)
lifecycleScope.launch {
Log.d("NetworkMonitor", "Tarmoq kuzatuvi boshlandi")
}
}
override fun onDestroy() {
super.onDestroy()
val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.unregisterNetworkCallback(networkCallback)
Log.d("NetworkMonitor", "onDestroy: callback bekor qilindi")
}
}
onDestroy da tarmoq qayta chaqiruvi ro'yxatdan o'tkazilishi bekor qilinadi. lifecycleScope hayot sikli yo'q qilinganda avtomatik bekor qilinadi — korutinni alohida bekor qilish talab qilinmaydi. Tarmoq callback i albatta ro'yxatdan o'chirilishi kerak, aks holda Activity yo'q qilingandan keyin ham tizimda qoladi.
Fragment onDestroyView da View ga havolalarni to'g'ri tozalaydi, yopilishlar sababli xotira oqishining oldini oladi.
class ProfileFragment : Fragment() {
private var avatarView: ImageView? = null
private var progressBar: ProgressBar? = null
private val imageLoader = ImageLoader()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
avatarView = view.findViewById(R.id.avatar)
progressBar = view.findViewById(R.id.progress)
loadProfile()
}
private fun loadProfile() {
viewLifecycleOwner.lifecycleScope.launch {
try {
progressBar?.visibility = View.VISIBLE
val bitmap = imageLoader.load("https://example.com/avatar.png")
avatarView?.setImageBitmap(bitmap)
} finally {
progressBar?.visibility = View.GONE
}
}
}
override fun onDestroyView() {
super.onDestroyView()
avatarView = null
progressBar = null
imageLoader.cancel()
}
override fun onDestroy() {
super.onDestroy()
Log.d("ProfileFragment", "onDestroy: Fragment to'liq yo'q qilindi")
}
}
onDestroyView da View ga havolalar nolga o'rnatiladi — bu, agar imageLoader dagi yopilish avatarView ga havolani ushlab qolsa, xotira oqishining oldini oladi. Fragmentning o'zi va uning ViewModel i onDestroy gacha omon qoladi. imageLoader.cancel() Fragment ekrandan chiqsa yuklashni bekor qiladi.
isFinishing() dan foydalanish Activity foydalanuvchi buyrug'i bilan yoki qayta yaratish uchun tugashini farqlash imkonini beradi.
class AnalyticsActivity : AppCompatActivity() {
private val analytics = Analytics()
override fun onDestroy() {
if (isFinishing) {
Log.d("AnalyticsActivity", "Activity finish() bilan tugaydi — analitika yuboramiz")
analytics.sendSessionEnd()
} else {
Log.d("AnalyticsActivity", "Activity qayta yaratiladi (aylanish/konfiguratsiya) — analitika yubormaymiz")
}
super.onDestroy()
}
}
isFinishing() ni tekshirish — analitika, loglash va sessiya ma'lumotlarini tozalash uchun muhim naqshdir. Aylanishda sessiya tugash hodisalarini yuborish kerak emas — foydalanuvchi hali ham ilova bilan ishlaydi. Google Analytics ga ko'ra, isFinishing() ni noto'g'ri tekshirish 40% soxta sessiya hodisalarining sababidir.
Tez-tez beriladigan savollar
Ha, mumkin — tizim tomonidan jarayonni o'ldirish (process death), foydalanuvchi tomonidan Force Stop yoki avariya tugashida. Google ma'lumotlariga ko'ra, Activity tugash holatlarining taxminan 5–8%i onDestroy chaqirilmasdan sodir bo'ladi. Dasturchi muhim ma'lumotlarni saqlash uchun onDestroy ga tayanmasligi kerak — onPause yoki onSaveInstanceState dan foydalaning.
finish() — Activity ni yo'q qilishni boshlaydigan chaqiruv. onDestroy — finish() bajarilishi jarayonida chaqiriladigan qayta chaqiruv. finish() standart tugashda onDestroy chaqirilishi uchun majburiydir. finish() tizim yoki dasturchi tomonidan chaqirilishi mumkin, onDestroy — faqat tizim qayta chaqiruvi.
Ha, albatta ham Activity, ham Fragment da. super.onDestroy() ChildFragmentManager, LoaderManager va boshqa tizim komponentlarini to'g'ri tozalashni ta'minlaydi. super.onDestroy() ni o'tkazib yuborish xotira oqishiga va fragmentlarni tiklash bilan bog'liq xatolarga olib keladi.
onCleared() Activity yoki Fragment ning onDestroy sidan keyin chaqiriladi, ViewModel endi kerak bo'lmaganda. Ekran aylanishida onCleared() chaqirilmaydi — ViewModel onDestroy dan omon qoladi. Tartib: onDestroy Activity/Fragment → (ViewModelStore tozalanadi) → onCleared().
Texnik jihatdan ha, lekin tavsiya etilmaydi. Activity onDestroy dan so'ng darhol yo'q qilinadi va ishga tushirilgan Service nazoratsiz qoladi. Fon vazifalari uchun kechikish bilan WorkManager dan foydalaning: WorkManager Activity tugaganidan keyin ham bajarilishni kafolatlaydi va process death dan omon qoladi.
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.