onDestroy: bu nima, Android-da Activity ishini yakunlash

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

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 — Activity yoki Fragment yo'q qilinishidan oldin so'nggi chaqiruv, resurslarni yakuniy tozalash uchun mo'ljallangan.
  • onDestroy chaqiruvi tizim tomonidan jarayonni o'ldirish (process death) paytida kafolatlanmaydi — muhim ma'lumotlarni saqlash uchun unga tayanmang.
  • onDestroy da fon vazifalarini bekor qilish, soketlar va ma'lumotlar bazasini yopish, ViewModelStore ni tozalash kerak.
  • onStop dan farqi: onStop — ko'rinishni yo'qotish (Activity xotirada tirik), onDestroy — to'liq yo'q qilish.
  • onDestroy dagi isFinishing() Activity foydalanuvchi buyrug'i bilan (finish()) yoki tizim qarori bilan tugashini ko'rsatadi.

onDestroy: Android-da bu nima?

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:

  • Aniq finish() chaqiruvi — foydalanuvchi "Orqaga" tugmasini bosdi yoki dasturchi finishActivity() ni chaqirdi.
  • Ekranning aylanishi — Activity yo'q qilinadi va yangi konfiguratsiya bilan qayta yaratiladi.
  • Konfiguratsiya o'zgarishi — klaviatura, til o'zgarishi, ekran o'lchamining o'zgarishi (multi-window).
  • Tizim qarori — Android resurslarni bo'shatish uchun Activity ni o'ldiradi (lekin onDestroy chaqirilmasligi mumkin).

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 qachon chaqiriladi — va qachon chaqirilmaydi

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:

  • Foydalanuvchi "Orqaga" tugmasini bosadi — Activity.finish() → onPause → onStop → onDestroy.
  • Ekranning aylanishi — Activity yo'q qilinadi (onPause → onStop → onDestroy), keyin qayta yaratiladi.
  • Konfiguratsiya o'zgarishi — Activity ni qayta yaratishni talab qiladigan tizim sozlamasi.
  • finishAffinity() chaqiruvi — stekdagi barcha Activity larni tugatish.
  • Fragment ni FragmentManager dan olib tashlash — Fragment onPause → onStop → onDestroyView → onDestroy → onDetach oladi.

onDestroy QACHON chaqirilmaydi:

  • Tizim tomonidan jarayonni o'ldirish (process death) — Android xotira yetishmasligida ilovaning butun jarayonini o'ldiradi. Activity onDestroy olmaydi, chunki jarayon Linux yadrosi darajasida tugatiladi.
  • Avariya tugashi — asosiy oqimda qo'lga olinmagan istisno ilovani onDestroy chaqirmasdan o'ldiradi.
  • Force Stop — foydalanuvchi ilovani sozlamalarda majburiy to'xtatadi.

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.

Activity va Fragmentda onDestroy: umumiy va farqlar

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.

KomponentYo'q qilish metodlariTartibViewModel omon qoladi
ActivityonDestroyonPause → onStop → onDestroyYo'q (faqat ViewModelStore saqlanmasa)
FragmentonDestroyView, onDestroy, onDetachonPause → onStop → onDestroyView → onDestroy → onDetachHa, 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 da nima qilish kerak: tozalash ro'yxati

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:

  • Korutin va Flow larni bekor qilish — viewModelScope ga bog'liq bo'lmagan job larni bekor qiling. viewModelScope avtomatik bekor qilinadi, lekin lifecycleScope Activity ning hayot sikliga bog'liq.
  • Soket va kanallarni yopish — WebSocket (OkHttp), BluetoothSocket, ServerSocket. Ularni yo'q qilingandan keyin ochiq saqlash tizim resurslarining oqishidir.
  • Fayl va oqimlarni yopish — FileInputStream, FileOutputStream, Cursor. Cursor yopilmasa ContentProvider da ANR ga sabab bo'lishi mumkin.
  • ContentObserver dan obunani bekor qilish — Activity tarkib o'zgarishlarini (aloqalar, media) kuzatsa.
  • BroadcastReceiver dan obunani bekor qilish — dinamik ro'yxatdan o'tgan receiver lar bekor qilinishi kerak.
  • Ma'lumotlar bazasini yopish — Room Application yo'q qilinganda ulanishni avtomatik yopadi, lekin to'g'ridan-to'g'ri SQLiteDatabase qo'lda close() talab qiladi.

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.

onDestroy va ViewModel: hamkorlik

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:

  • Activity: onPause → onStop → onDestroy (Activity yo'q qilindi).
  • ViewModel: Yo'q qilinmadi — ViewModelStore saqlanadi va yangi Activity ga uzatiladi.
  • Yangi Activity: onCreate → onStart → onResume, xuddi shu ViewModel ni oladi.

finish() da (foydalanuvchi "Orqaga" tugmasini bosdi):

  • Activity: onPause → onStop → onDestroy.
  • ViewModel: onCleared() — Activity ning onDestroy sidan keyin chaqiriladi.
  • Barcha viewModelScope korutinlari avtomatik bekor qilinadi.

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.

Kotlin da onDestroy bilan kod misollari

Misol 1: lifecycleScope korutinini bekor qilish bilan onDestroy Activity

Activity da lifecycleScope ni to'g'ri boshqarishni ko'rsatadi: korutin tarmoq holatini kuzatish uchun ishga tushiriladi va onDestroy da bekor qilinadi.

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

Misol 2: View havolalarini tozalash bilan onDestroy Fragment

Fragment onDestroyView da View ga havolalarni to'g'ri tozalaydi, yopilishlar sababli xotira oqishining oldini oladi.

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

Misol 3: onDestroy da isFinishing ni tekshirish

isFinishing() dan foydalanish Activity foydalanuvchi buyrug'i bilan yoki qayta yaratish uchun tugashini farqlash imkonini beradi.

kotlin
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

onDestroy chaqirilmasligi mumkinmi?

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.

onDestroy finish() dan nima bilan farq qiladi?

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.

Fragment da super.onDestroy() chaqirish kerakmi?

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.

ViewModel ning onCleared() onDestroy ga nisbatan qachon chaqiriladi?

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().

onDestroy dan Service ishga tushirish mumkinmi?

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

  • onDestroy — Activity va Fragment hayot siklining yakuniy qayta chaqiruvi, komponentni to'liq yo'q qilishdan oldin chaqiriladi.
  • onDestroy chaqiruvi process death paytida kafolatlanmaydi — taxminan 5–8% tugashlar unsiz sodir bo'ladi.
  • onDestroy da bo'shatilishi kerak: tarmoq callback lari, soketlar, fayl oqimlari, BroadcastReceiver, ContentObserver.
  • ViewModel.onCleared() Activity ning onDestroy sidan keyin chaqiriladi — viewModelScope avtomatik bekor qilinadi.
  • Fragment da onDestroyView (onDestroy dan alohida) — View ga havolalarni nolga o'rnatish uchun to'g'ri joy.
  • onDestroy da isFinishing() tekshiruvi finish() tugashini konfiguratsiya o'zgarishlarida qayta yaratishdan farqlash imkonini beradi.
  • Ma'lumotlarni saqlash uchun onDestroy ga tayanmang — onPause yoki onSaveInstanceState dan foydalaning.

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