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 — 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:
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 ə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:
onDestroy NƏ VAXT çağırılmı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.
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.
| Komponent | Məhv etmə metodları | Sıra | ViewModel sağ qalır |
|---|---|---|---|
| Activity | onDestroy | onPause → onStop → onDestroy | Xeyr (yalnız ViewModelStore saxlanılmayıbsa) |
| Fragment | onDestroyView, onDestroy, onDetach | onPause → onStop → onDestroyView → onDestroy → onDetach | Bə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 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ı:
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.
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ı:
finish() zamanı (istifadəçi "Geri" düyməsini basdı):
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.
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.
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.
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.
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.
isFinishing() istifadəsi Activity-nin istifadəçinin əmri ilə yoxsa yenidən yaratmaq üçün bitdiyini ayırd etməyə imkan verir.
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
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.
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ışı.
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.
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().
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ə
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.
Həm də oxuyun