onDestroy: bu nədir, Android-də Activity-nin işini bitirməsi

Müəllif: IT Sectr Dərc olunub: 2026-03-04 Oxuma vaxtı: 8 dəq

onDestroy — Android-də Activity və Fragment-in həyat dövrünün son metodu, komponentin tam məhv edilməsindən əvvəl çağırılır. onDestroy, Activity və ya Fragment-in işini bitirdiyini bildirir: bütün resurslar azad edilməli, iç-içə fragmentlər məhv edilməli, ViewModel təmizlənməlidir. Google məlumatlarına görə, onDestroy Activity-nin bitməsi hallarının 100%-də çağırılır, lakin prosesin öldürülməsi (process death) zamanı sistem onDestroy çağırışını tamamilə buraxa bilər. Android-in onDestroy haqqında sənədləri bu metodun qəza zamanı çağırılacağına zəmanət vermədiyini vurğulayır.

Əsas məqamlar

  • onDestroy — Activity və ya Fragment-in məhv edilməsindən əvvəl son çağırış, resursların son təmizlənməsi üçün nəzərdə tutulub.
  • onDestroy çağırışı sistem tərəfindən prosesin öldürülməsi (process death) zamanı təmin olunmur — kritik məlumatların saxlanması üçün ona etibar etməyin.
  • onDestroy-də fon tapşırıqları ləğv etmək, soketləri və verilənlər bazasını bağlamaq, ViewModelStore-i təmizləmək lazımdır.
  • onStop-dan fərqi: onStop — görünmənin itirilməsi (Activity yaddaşda qalır), onDestroy — tam məhv etmə.
  • onDestroy-də isFinishing() Activity-nin istifadəçinin əmri ilə (finish()) yoxsa sistem qərarı ilə bitdiyini göstərir.

onDestroy: Android-də bu nədir?

onDestroy — Android-in Activity və ya Fragment-i tam məhv etməzdən əvvəl çağırdığı geriçağırış metodudur. Bu, resursları azad etmək, fon əməliyyatlarını ləğv etmək və məlumatlarla işi bitirmək üçün proqramçının son şansıdır. onDestroy icra edildikdən sonra Activity/Fragment nümunəsi zibil yığıcıya (GC) işarələnir və artıq istifadə edilə bilməz.

onDestroy çağırılmasının səbəbləri:

  • Açıq finish() çağırışı — istifadəçi "Geri" düyməsini basdı və ya proqramçı finishActivity() çağırdı.
  • Ekranın döndərilməsi — Activity məhv edilir və yeni konfiqurasiya ilə yenidən yaradılır.
  • Konfiqurasiya dəyişikliyi — klaviatura, dil dəyişikliyi, ekran ölçüsünün dəyişməsi (multi-window).
  • Sistem qərarı — Android resursları boşaltmaq üçün Activity-ni öldürür (lakin onDestroy çağırılmay bilər).

Google Android Vitals (2025) statistikasına görə, Activity-nin məhv edilməsi hallarının təxminən 12%-i ekranın döndərilməsi, 65%-i finish() və 23%-i konfiqurasiya dəyişikliyi səbəbindəndir. onDestroy-nin buraxılması ilə prosesin öldürülmə faizi az RAM-lı (4 GB-dan az) cihazlardan asılı olaraq təxminən 5–8% təşkil edir.

onDestroy nə vaxt çağırılır — və nə vaxt çağırılmır

onDestroy əksər standart ssenarilərdə çağırılır, lakin proqramçının nəzərə almalı olduğu vacib istisnalar var. onDestroy çağırışı zəmanətlərini başa düşmək tətbiqin arxitekturası, xüsusilə məlumatların saxlanması və WorkManager tapşırıqlarının ləğvi üçün kritik əhəmiyyət daşıyır.

onDestroy nə vaxt çağırılır:

  • İstifadəçi "Geri" düyməsini basır — Activity.finish() → onPause → onStop → onDestroy.
  • Ekranın döndərilməsi — Activity məhv edilir (onPause → onStop → onDestroy), sonra yenidən yaradılır.
  • Konfiqurasiya dəyişikliyi — Activity-nin yenidən yaradılmasını tələb edən sistem parametri.
  • finishAffinity() çağırışı — yığındakı bütün Activity-lərin bitirilməsi.
  • Fragment-in FragmentManager-dən silinməsi — Fragment onPause → onStop → onDestroyView → onDestroy → onDetach alır.

onDestroy NƏ VAXT çağırılmır:

  • Sistem tərəfindən prosesin öldürülməsi (process death) — Android yaddaş çatışmazlığı zamanı tətbiqin bütün prosesini öldürür. Activity onDestroy almır, çünki proses Linux nüvəsi səviyyəsində dayandırılır.
  • Qəza nəticəsində bitmə — əsas axında tutulmayan istisna tətbiqi onDestroy çağırmadan öldürür.
  • Force Stop — istifadəçi tətbiqi parametrlərdə məcburi dayandırır.

onDestroy çağırışı zəmanətinin olmaması səbəbindən Google tövsiyə edir: kritik məlumatların saxlanması üçün heç vaxt onDestroy-ə etibar etməyin. onSaveInstanceState(), WorkManager və ya avtomatik yadda saxlanması olan Room-dan istifadə edin. onDestroy — resursların azad edilməsi üçündür, məlumatların davamlılığı üçün deyil.

Activity və Fragment-də onDestroy: ortaq və fərqli cəhətlər

onDestroy həm Activity, həm də Fragment üçün mövcuddur, lakin fərqli müqavilələrlə. Fragment-in həyat dövrü daha təfərrüatlıdır: onDestroy-dən əlavə onDestroyView (View iyerarxiyasının məhv edilməsi) və onDetach (Activity-dən ayrılma) var.

KomponentMəhv etmə metodlarıSıraViewModel sağ qalır
ActivityonDestroyonPause → onStop → onDestroyXeyr (yalnız ViewModelStore saxlanılmayıbsa)
FragmentonDestroyView, onDestroy, onDetachonPause → onStop → onDestroyView → onDestroy → onDetachBəli, əgər Fragment silinməyibsə

Əsas fərq: Fragment-də View Fragment-in özündən daha tez-tez yenidən yaradılır. Ekranın döndərilməsi zamanı Fragment onDestroyView (View-in məhv edilməsi) keçir, lakin Fragment-in özü və onun ViewModel-i sağ qalır. onDestroyView — yaddaş sızmalarının qarşısını almaq üçün View-ə istinadları təmizləmək üçün düzgün yerdir. Fragment-in onDestroy-si — Activity-nin onDestroy-si ilə analoq, Fragment tam silindikdə çağırılır.

İç-içə fragmentlər (child fragments) valideyn Fragment-in onDestroy-sindən əvvəl məhv edilir. Activity-də uşaq fragmentlər valideyn Activity-nin onDestroy-si çağırıldıqda onDestroy alır. Sıra təmin edilir: fragmentlər onları ehtiva edən Activity-dən daha tez bitir.

onDestroy-də nə etməli: təmizləmə yoxlama siyahısı

onDestroy Activity və ya Fragment-dən daha uzun yaşamamalı olan bütün resursların azad edilməsi üçün nəzərdə tutulub. Geri qayıdana qədər resursları azad edən onStop-dan fərqli olaraq, onDestroy son təmizləməni yerinə yetirir.

onDestroy-də məcburi tədbirlərin yoxlama siyahısı:

  • Korutinlərin və Flow-nun ləğvi — viewModelScope-a bağlı olmayan job-ları ləğv edin. viewModelScope avtomatik ləğv edilir, lakin lifecycleScope Activity-nin həyat dövrünə bağlıdır.
  • Soketlərin və kanalların bağlanması — WebSocket (OkHttp), BluetoothSocket, ServerSocket. Məhv edildikdən sonra onları açıq saxlamaq sistem resurslarının sızmasıdır.
  • Faylların və axınların bağlanması — FileInputStream, FileOutputStream, Cursor. Cursor bağlanmadıqda ContentProvider-də ANR-yə səbəb ola bilər.
  • ContentObserver-dən abunəliyin ləğvi — Activity məzmun dəyişikliklərini (əlaqələr, media) izləyirsə.
  • BroadcastReceiver-dən abunəliyin ləğvi — dinamik qeydiyyatdan keçmiş receiver-lər ləğv edilməlidir.
  • Verilənlər bazasının bağlanması — Room Application məhv edildikdə əlaqəni avtomatik bağlayır, lakin birbaşa SQLiteDatabase əl ilə close() tələb edir.

onDestroy-də NƏ ETMƏMƏLİ: Məlumatları onDestroy-də saxlamayın — onPause və ya onSaveInstanceState istifadə edin. Yeni Service və ya WorkManager tapşırıqları başlatmayın — Activity məhv ediləcək və nəticəni izləyə bilməyəcəksiniz. UI-ni yeniləməyə çalışmayın — View iyerarxiyası artıq məhv edilib və ya məhv edilmə prosesindədir; findViewById() null qaytaracaq.

onDestroy və ViewModel: birgə iş

ViewModel ekranın döndərilməsi zamanı onDestroy Activity-ni sağ qalmaq üçün layihələndirilib, lakin finish() zamanı Activity ilə birlikdə məhv edilir. Bu asimmetrik davranış — proqramçılar arasında qarışıqlığın əsas səbəbidir.

Ekranın döndərilməsi zamanı:

  • Activity: onPause → onStop → onDestroy (Activity məhv edildi).
  • ViewModel: Məhv edilmədi — ViewModelStore saxlanılır və yeni Activity-ə ötürülür.
  • Yeni Activity: onCreate → onStart → onResume, eyni ViewModel-i alır.

finish() zamanı (istifadəçi "Geri" düyməsini basdı):

  • Activity: onPause → onStop → onDestroy.
  • ViewModel: onCleared() — Activity-nin onDestroy-sindən sonra çağırılır.
  • Bütün viewModelScope korutinləri avtomatik ləğv edilir.

Buna görə onDestroy-də viewModelScope-u ləğv etmək lazım deyil — ViewModel bunu özü edəcək. lifecycleScope (Activity-yə bağlı, ViewModel-ə deyil) istifadə edirsinizsə, onu onDestroy-də lifecycleScope.cancel() ilə ləğv edin və ya Job-u əl ilə idarə edin.

Kotlin-də onDestroy ilə kod nümunələri

Nümunə 1: lifecycleScope korutinlərinin ləğvi ilə onDestroy Activity

Activity-də lifecycleScope-un düzgün idarə olunmasını nümayiş etdirir: korutin şəbəkə statusunu izləmək üçün işə salınır və onDestroy-də ləğv edilir.

kotlin
class NetworkMonitorActivity : AppCompatActivity() {
    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            Log.d("NetworkMonitor", "Şəbəkə mövcuddur")
        }
        override fun onLost(network: Network) {
            Log.d("NetworkMonitor", "Şəbəkə itirildi")
        }
    }

    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", "Şəbəkə müşahidəsi başladıldı")
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        val connectivityManager = getSystemService(ConnectivityManager::class.java)
        connectivityManager.unregisterNetworkCallback(networkCallback)
        Log.d("NetworkMonitor", "onDestroy: callback ləğv edildi")
    }
}

onDestroy-də şəbəkə geriçağırışının qeydiyyatı ləğv edilir. lifecycleScope həyat dövrü məhv edildikdə avtomatik ləğv edilir — korutinin ayrıca ləğvi tələb olunmur. Şəbəkə callback-i mütləq qeydiyyatdan çıxarılmalıdır, əks halda Activity məhv edildikdən sonra da sistemdə qalacaq.

Nümunə 2: View istinadlarının təmizlənməsi ilə onDestroy Fragment

Fragment onDestroyView-də View-ə istinadları düzgün təmizləyir, bağlanmalar səbəbindən yaddaş sızmalarının qarşısını alır.

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 tamamilə məhv edildi")
    }
}

onDestroyView-də View-ə istinadlar sıfırlanır — bu, imageLoader-dəki bağlanma avatarView-ə istinadı saxlayarsa yaddaş sızmasının qarşısını alır. Fragment-in özü və onun ViewModel-i onDestroy-yə qədər sağ qalır. imageLoader.cancel() Fragment ekrandan çıxarsa yükləməni ləğv edir.

Nümunə 3: onDestroy-də isFinishing yoxlanması

isFinishing() istifadəsi Activity-nin istifadəçinin əmri ilə yoxsa yenidən yaratmaq üçün bitdiyini ayırd etməyə imkan verir.

kotlin
class AnalyticsActivity : AppCompatActivity() {
    private val analytics = Analytics()

    override fun onDestroy() {
        if (isFinishing) {
            Log.d("AnalyticsActivity", "Activity finish() ilə bitir — analitika göndəririk")
            analytics.sendSessionEnd()
        } else {
            Log.d("AnalyticsActivity", "Activity yenidən yaradılır (döndərmə/konfiqurasiya) — analitika göndərmirik")
        }
        super.onDestroy()
    }
}

isFinishing() yoxlanması — analitika, loglama və sessiya məlumatlarının təmizlənməsi üçün vacib nümunədir. Döndərmə zamanı sessiyanın bitmə hadisələrini göndərmək lazım deyil — istifadəçi hələ də tətbiqlə işləyir. Google Analytics-ə görə, isFinishing()-in səhv yoxlanması 40% yalançı sessiya hadisələrinin səbəbidir.

Tez-tez verilən suallar

onDestroy çağırılmay bilər?

Bəli, çağırılmay bilər — sistem tərəfindən prosesin öldürülməsi (process death), istifadəçi tərəfindən Force Stop və ya qəza nəticəsində bitmə zamanı. Google məlumatlarına görə, Activity-nin bitmə hallarının təxminən 5–8%-i onDestroy çağırılmadan baş verir. Proqramçı kritik məlumatların saxlanması üçün onDestroy-ə etibar etməməlidir — onPause və ya onSaveInstanceState istifadə edin.

onDestroy finish()-dən nə ilə fərqlənir?

finish() — Activity-nin məhv edilməsini başladan çağırış. onDestroy — finish()-in icrası zamanı çağırılan geriçağırış. finish() standart bitmə zamanı onDestroy-un çağırılması üçün məcburidir. finish() sistem və ya proqramçı tərəfindən çağırıla bilər, onDestroy — yalnız sistem geriçağırışı.

Fragment-də super.onDestroy() çağırmaq lazımdır?

Bəli, mütləq həm Activity, həm də Fragment-də. super.onDestroy() ChildFragmentManager, LoaderManager və digər sistem komponentlərinin düzgün təmizlənməsini təmin edir. super.onDestroy()-nin buraxılması yaddaş sızmalarına və fragmentlərin bərpası ilə bağlı səhvlərə səbəb olur.

ViewModel-in onCleared() nə vaxt çağırılır onDestroy-ə nisbətən?

onCleared() Activity və ya Fragment-in onDestroy-sindən sonra çağırılır, ViewModel artıq lazım olmadıqda. Ekranın döndərilməsi zamanı onCleared() çağırılmır — ViewModel onDestroy-dən sağ çıxır. Sıra: onDestroy Activity/Fragment → (ViewModelStore təmizlənir) → onCleared().

onDestroy-dən Service işə salmaq olar?

Texniki olaraq bəli, amma tövsiyə edilmir. Activity onDestroy-dən dərhal sonra məhv edilir və işə salınan Service nəzarətsiz qalır. Fon tapşırıqları üçün gecikmə ilə WorkManager istifadə edin: WorkManager Activity bitdikdən sonra da icranı təmin edir və process death-dən sağ çıxır.

Nəticə

  • onDestroy — Activity və Fragment-in həyat dövrünün son geriçağırışı, komponentin tam məhv edilməsindən əvvəl çağırılır.
  • onDestroy çağırışı process death zamanı təmin olunmur — təxminən 5–8% bitmələr onsuz baş verir.
  • onDestroy-də azad edilməli: şəbəkə callback-ləri, soketlər, fayl axınları, BroadcastReceiver, ContentObserver.
  • ViewModel.onCleared() Activity-nin onDestroy-sindən sonra çağırılır — viewModelScope avtomatik ləğv edilir.
  • Fragment-də onDestroyView (onDestroy-dən ayrı) — View-ə istinadları sıfırlamaq üçün düzgün yerdir.
  • onDestroy-də isFinishing() yoxlanması finish() bitməsini konfiqurasiya dəyişikliklərində yenidən yaratmadan ayırd etməyə imkan verir.
  • Məlumatların saxlanması üçün onDestroy-ə etibar etməyin — onPause və ya onSaveInstanceState istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun