onDestroy — ang huling paraan ng lifecycle ng Activity at Fragment sa Android, na tinatawag bago ang kumpletong pagwasak ng component. Ang onDestroy ay nagpapahiwatig na ang Activity o Fragment ay nagtatapos ng trabaho nito: lahat ng resources ay dapat palayain, nested fragments — wasakin, ViewModel — linisin. Ayon sa data ng Google, ang onDestroy ay tinatawag sa 100% ng mga kaso ng pagtatapos ng Activity, ngunit sa pagpatay ng proseso (process death) maaaring laktawan ng system ang pagtawag sa onDestroy nang buo. Dokumentasyon ng Android tungkol sa onDestroy ay nagbibigay-diin na ang pamamaraang ito ay hindi garantiya ng pagtawag sa emergency na pagtatapos.
Mga Pangunahing Punto
onDestroy — isang callback method na tinatawag ng Android bago tuluyang wasakin ang Activity o Fragment. Ito ang huling pagkakataon para sa developer na palayain ang resources, kanselahin ang mga background operation, at tapusin ang trabaho gamit ang data. Pagkatapos ng execution ng onDestroy, ang instance ng Activity/Fragment ay minarkahan para sa garbage collection (GC) at hindi na magagamit.
Mga dahilan ng pagtawag sa onDestroy:
Ayon sa statistics ng Google Android Vitals (2025), humigit-kumulang 12% ng lahat ng kaso ng pagwasak ng Activity ay dahil sa pag-ikot ng screen, 65% dahil sa finish() at 23% dahil sa pagbabago ng configuration. Ang porsyento ng pagpatay ng proseso na may paglaktaw sa onDestroy ay humigit-kumulang 5–8% depende sa device na may maliit na RAM (mas mababa sa 4 GB).
Ang onDestroy ay tinatawag sa karamihan ng mga standard na sitwasyon, ngunit may mahahalagang eksepsyon na dapat isaalang-alang ng developer. Ang pag-unawa sa mga garantiya ng pagtawag sa onDestroy ay kritikal para sa arkitektura ng application, lalo na para sa pag-save ng data at pagkansela ng mga WorkManager task.
Kailan tinatawag ang onDestroy:
Kailan HINDI tinatawag ang onDestroy:
Dahil sa kawalan ng garantiya ng pagtawag sa onDestroy, inirerekomenda ng Google: huwag kailanman umasa sa onDestroy para sa pag-save ng kritikal na data. Gamitin ang onSaveInstanceState(), WorkManager, o Room na may automatic na pag-save. onDestroy — para sa pagpapalaya ng resources, hindi para sa persistence.
Ang onDestroy ay umiiral para sa parehong Activity at Fragment, ngunit may magkaibang kontrata. Sa Fragment, ang lifecycle ay mas detalyado: bukod sa onDestroy mayroong onDestroyView (pagwasak ng View hierarchy) at onDetach (paghiwalay mula sa Activity).
| Component | Mga paraan ng pagwasak | Pagkakasunod-sunod | ViewModel nakaligtas |
|---|---|---|---|
| Activity | onDestroy | onPause → onStop → onDestroy | Hindi (kung hindi nai-save ang ViewModelStore) |
| Fragment | onDestroyView, onDestroy, onDetach | onPause → onStop → onDestroyView → onDestroy → onDetach | Oo, kung ang Fragment ay hindi inalis |
Ang pangunahing pagkakaiba: sa Fragment, ang View ay mas madalas na nilikhang muli kaysa sa Fragment mismo. Sa pag-ikot ng screen, ang Fragment ay dumadaan sa onDestroyView (pagwasak ng View), ngunit ang Fragment mismo at ang ViewModel nito ay nananatiling buhay. onDestroyView — ang tamang lugar para linisin ang mga reference sa View upang maiwasan ang pagtagas ng memorya. onDestroy ng Fragment — kahalintulad ng onDestroy ng Activity, tinatawag kapag ganap na inalis ang Fragment.
Ang mga nested fragment (child fragments) ay winawasak bago ang onDestroy ng parent Fragment. Sa Activity, ang child fragments ay tumatanggap ng onDestroy kapag tinawag ang onDestroy ng parent Activity. Ang pagkakasunod-sunod ay garantisado: ang mga fragment ay natatapos nang mas maaga kaysa sa Activity na naglalaman ng mga ito.
Ang onDestroy ay para sa pagpapalaya ng lahat ng resources na hindi dapat mabuhay nang mas mahaba kaysa sa Activity o Fragment. Hindi tulad ng onStop na nagpapalaya ng resources hanggang sa pagbabalik, ang onDestroy ay nagsasagawa ng huling paglilinis.
Checklist ng mga ipinag-uutos na aksyon sa onDestroy:
Ano ang HINDI gagawin sa onDestroy: Huwag mag-save ng data sa onDestroy — gamitin ang onPause o onSaveInstanceState. Huwag magsimula ng bagong Service o WorkManager task — ang Activity ay wawasakin at hindi mo masusubaybayan ang resulta. Huwag subukang i-update ang UI — ang View hierarchy ay wasak na o nasa proseso ng pagwasak; ang pagtawag sa findViewById() ay magbabalik ng null.
Ang ViewModel ay dinisenyo upang mabuhay mula sa onDestroy ng Activity sa pag-ikot ng screen, ngunit mawasak kasama ng Activity sa finish(). Ang asimetrikong pag-uugali na ito — ang pangunahing dahilan ng pagkalito sa mga developer.
Sa pag-ikot ng screen:
Sa finish() (pinindot ng user ang "Bumalik"):
Samakatuwid, ang pagkansela ng viewModelScope sa onDestroy ay hindi kinakailangan — ang ViewModel ang gagawa nito. Kung gumagamit ka ng lifecycleScope (naka-ugnay sa Activity, hindi sa ViewModel), kanselahin ito sa onDestroy sa pamamagitan ng lifecycleScope.cancel() o pamahalaan ang Job nang manu-mano.
Nagpapakita ng wastong pamamahala ng lifecycleScope sa Activity: ang coroutine ay sinimulan para sa pagsubaybay sa katayuan ng network at kinansela sa onDestroy.
class NetworkMonitorActivity : AppCompatActivity() {
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("NetworkMonitor", "Network available")
}
override fun onLost(network: Network) {
Log.d("NetworkMonitor", "Network nawala")
}
}
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", "Pagsubaybay sa network sinimulan")
}
}
override fun onDestroy() {
super.onDestroy()
val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.unregisterNetworkCallback(networkCallback)
Log.d("NetworkMonitor", "onDestroy: callback nakansela")
}
}
Sa onDestroy, ang rehistrasyon ng network callback ay kinansela. Ang lifecycleScope ay awtomatikong kinakansela kapag winasak ang lifecycle — hindi kinakailangan ang hiwalay na pagkansela ng coroutine. Ang network callback ay dapat na naka-unsubscribe, kung hindi man ito ay mananatili sa system kahit pagkatapos ng pagwasak ng Activity.
Ang Fragment ay wastong naglilinis ng mga reference sa View sa onDestroyView, na pumipigil sa pagtagas ng memorya dulot ng mga closure.
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 ganap na nawasak")
}
}
Sa onDestroyView, ang mga reference sa View ay nire-reset sa zero — ito ay pumipigil sa pagtagas ng memorya kung ang closure sa imageLoader ay humahawak ng reference sa avatarView. Ang Fragment mismo at ang ViewModel nito ay nananatiling buhay hanggang onDestroy. imageLoader.cancel() ay kinakansela ang pag-load kung ang Fragment ay umalis sa screen.
Ang paggamit ng isFinishing() ay nagbibigay-daan upang makilala kung ang Activity ay nagtatapos sa utos ng user o para sa muling paglikha.
class AnalyticsActivity : AppCompatActivity() {
private val analytics = Analytics()
override fun onDestroy() {
if (isFinishing) {
Log.d("AnalyticsActivity", "Activity nagtatapos sa finish() — nagpapadala ng analytics")
analytics.sendSessionEnd()
} else {
Log.d("AnalyticsActivity", "Activity nilikhang muli (rotation/configuration) — hindi nagpapadala ng analytics")
}
super.onDestroy()
}
}
Ang pagsusuri ng isFinishing() — mahalagang pattern para sa analytics, pag-log at paglilinis ng session data. Sa pag-ikot, hindi kailangang magpadala ng mga event ng pagtatapos ng session — ang user ay nagtatrabaho pa rin sa application. Ayon sa Google Analytics, ang maling pagsusuri ng isFinishing() ay sanhi ng 40% ng mga maling session event.
Mga Madalas Itanong
Oo, maaari — sa pagpatay ng proseso ng system (process death), Force Stop ng user o emergency na pagtatapos. Ayon sa data ng Google, humigit-kumulang 5–8% ng pagtatapos ng Activity ay nangyayari nang walang pagtawag sa onDestroy. Ang developer ay hindi dapat umasa sa onDestroy para sa pag-save ng kritikal na data — gamitin ang onPause o onSaveInstanceState.
finish() — ang tawag na nag-uumpisa ng pagwasak ng Activity. onDestroy — ang callback na tinatawag sa proseso ng execution ng finish(). Ang finish() ay kinakailangan para sa pagtawag ng onDestroy sa normal na pagtatapos. Ang finish() ay maaaring tawagin ng system o developer, ang onDestroy — callback lamang ng system.
Oo, kinakailangan kapwa sa Activity at sa Fragment. Ang super.onDestroy() ay nagsisiguro ng wastong paglilinis ng ChildFragmentManager, LoaderManager at iba pang system component. Ang paglaktaw sa super.onDestroy() ay humahantong sa pagtagas ng memorya at mga bug sa pag-restore ng fragment.
Ang onCleared() ay tinatawag pagkatapos ng onDestroy ng Activity o Fragment, kapag hindi na kailangan ang ViewModel. Sa pag-ikot ng screen, ang onCleared() ay hindi tinatawag — ang ViewModel ay nabubuhay mula sa onDestroy. Pagkakasunod-sunod: onDestroy Activity/Fragment → (ViewModelStore ay nililinis) → onCleared().
Teknikal na oo, ngunit hindi inirerekomenda. Ang Activity ay agad na nawawasak pagkatapos ng onDestroy at ang sinimulang Service ay nananatiling walang kontrol. Para sa mga background task, gamitin ang WorkManager na may delay: ginagarantiyahan ng WorkManager ang execution kahit pagkatapos ng pagtatapos ng Activity at nabubuhay mula sa process death.
Konklusyon
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din