lifecycleScope — ano ito, pagkakaugnay sa Lifecycle at paggawa sa Android

May-akda: IT Sectr Nai-publish: 2026-06-23 Oras ng pagbabasa: 9 min

lifecycleScope — ay isang built-in na CoroutineScope mula sa library na androidx.lifecycle, na nakaugnay sa lifecycle ng Activity, Fragment o anumang LifecycleOwner at awtomatikong kinakansela ang mga coroutine kapag nawasak ang component. Ayon sa Google Android Developers, 2025, pinapayagan ng lifecycleScope na ligtas na magpatakbo ng mga coroutine na nauugnay sa UI layer nang walang panganib na mag-execute ng code pagkatapos masira ang Activity o Fragment. Awtomatikong kinakansela ang scope kapag lumipat ang LifecycleOwner sa estado na DESTROYED.

Mga Pangunahing Punto

  • lifecycleScope — CoroutineScope mula sa lifecycle-runtime-ktx, kinakansela sa DESTROYED na estado ng Lifecycle
  • lifecycleScope.launch — paglunsad ng coroutine na awtomatikong kinakansela kapag nawasak ang LifecycleOwner
  • launchWhenStarted / launchWhenResumed — mga lumang pamamaraan, pinalitan ng repeatOnLifecycle
  • repeatOnLifecycle — modernong API para sa pagpapatakbo ng mga coroutine na sumusunod sa partikular na estado ng Lifecycle
  • Dispatchers.Main.immediate — default na dispatcher para sa lifecycleScope

Ano ang lifecycleScope sa Android?

lifecycleScope — ay isang extension property sa interface ng LifecycleOwner (Activity, Fragment, Service) na nagbibigay ng handa nang CoroutineScope na nakaugnay sa buong lifecycle ng component. Kapag naabot ng LifecycleOwner ang estado na DESTROYED, awtomatikong kinakansela ng lifecycleScope ang lahat ng aktibong coroutine.

kotlin
// Sa Fragment o Activity
lifecycleScope.launch {
    delay(1000)
    showSnackbar("Kumusta!")
}

Hindi tulad ng viewModelScope, kinakansela ang lifecycleScope sa bawat pagkasira ng LifecycleOwner — kabilang ang pag-ikot ng screen. Ginagawa nitong perpekto para sa mga operasyon na dapat mabuhay lamang habang nakikita ang isang partikular na screen.

Saan available ang lifecycleScope

Available ang lifecycleScope saanman mayroong LifecycleOwner:

  • Activity — AppCompatActivity ay nagmamana ng LifecycleOwner
  • Fragment — Fragment ay nagmamana ng LifecycleOwner
  • LifecycleService — serbisyo na may lifecycle
  • ProcessLifecycleOwner — lifecycle ng buong aplikasyon
  • Custom na LifecycleOwner — anumang bagay na nagpapatupad ng LifecycleOwner

Paano gumagana ang lifecycleScope: Lifecycle at awtomatikong pagkansela

Ang mekanismo ng awtomatikong pagkansela ng lifecycleScope ay batay sa subscription sa mga pangyayari sa Lifecycle. Kapag bumaba ang Lifecycle sa ibaba ng CREATED patungong DESTROYED, kinakansela ang scope.

Mga estado ng Lifecycle

  • CREATED
  • LifecycleOwner nilikha, naisakatuparan ang onCreate
  • Oo
  • STARTED
  • LifecycleOwner nakikita (onStart)
  • Oo
  • RESUMED
  • LifecycleOwner nasa foreground (onResume)
  • Oo
  • DESTROYED
  • LifecycleOwner nawasak (onDestroy)
  • Hindi (kinansela ang scope)
  • EstadoPaglalarawanAktibo ang scope

    Panloob na istruktura ng lifecycleScope

    Ang lifecycleScope ay nilikha bilang CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) at iniimbak sa loob ng Lifecycle. Kapag lumipat ang Lifecycle sa estado na DESTROYED, tinatawag ang scope.cancel(). Ang mekanismo ay ipinatupad sa pamamagitan ng LifecycleEventObserver, na nag-subscribe sa mga pangyayari sa lifecycle sa unang pag-access sa scope.

    Pag-uugali sa pag-ikot

    Sa pag-ikot ng screen, nawasak ang Activity (onDestroy) at muling nilikha. Kinakansela ang lifecycleScope kasama ang lumang Activity, at isang bagong instance ng scope ang nilikha para sa bagong Activity. Ito ay pangunahing pagkakaiba mula sa viewModelScope, na pinapanatili sa pag-ikot.

    API ng lifecycleScope: launch, launchWhen at repeatOnLifecycle

    Ang library ng lifecycle ay nagbibigay ng ilang paraan upang magpatakbo ng mga coroutine sa pamamagitan ng lifecycleScope. Tingnan natin ang ebolusyon ng API mula sa mga lumang pamamaraan patungo sa moderno.

    lifecycleScope.launch — batayang paglunsad

    Ang pinakasimpleng paraan — lifecycleScope.launch { ... }. Agad na magsisimula ang coroutine at kinakansela sa DESTROYED. Gayunpaman, maaari itong mag-execute ng code kahit hindi nakikita ang UI (halimbawa, sa background pagkatapos ng onStop). Ito ay hindi palaging kanais-nais.

    Luma: launchWhenCreated / launchWhenStarted / launchWhenResumed

    Ang mga pamamaraang ito ay nagpa-pause ng pagpapatupad ng coroutine kapag bumaba ang Lifecycle sa ibaba ng tinukoy na estado at nagpatuloy sa pagbabalik. Gayunpaman, minarkahan ang mga ito bilang @Deprecated sa lifecycle-runtime-ktx 2.6.0, dahil:

    • Hindi kinakansela ang coroutine — pinapa-pause lamang
    • Nagdulot ng akumulasyon ng mga nakabitin na coroutine na kumukonsumo ng memorya
    • Lumikha ng race condition sa mabilis na paglipat ng estado

    Modernong API: repeatOnLifecycle

    repeatOnLifecycle — ang inirerekomendang paraan ng Google para magpatakbo ng mga coroutine na naka-synchronize sa lifecycle. Kinakansela at ni-restart nito ang coroutine sa bawat oras na maabot ng Lifecycle ang isang tinukoy na estado.

    kotlin
    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            viewModel.uiState.collect { state ->
                updateUI(state)
            }
        }
    }

    Ang coroutine na ipinasa sa repeatOnLifecycle ay magsisimula kapag naabot ng Lifecycle ang STARTED at kinakansela kapag bumaba ito sa ibaba ng STARTED. Sa pagbabalik sa STARTED, magsisimula muli ang coroutine. Ito ay ligtas at mahusay — walang coroutine na nakabitin sa pause.

    flowWithLifecycle — para sa Flow

    Para sa pagkolekta ng data mula sa Flow na isinasaalang-alang ang lifecycle, mayroong operator na flowWithLifecycle. Awtomatiko nitong itinitigil at ipinagpapatuloy ang pagkolekta kapag nagbago ang estado ng Lifecycle:

    kotlin
    viewModel.uiState
        .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
        .onEach { state -> updateUI(state) }
        .launchIn(lifecycleScope)

    Ang operator na flowWithLifecycle — ang pinakamaikling paraan ng ligtas na subscription sa Flow sa UI layer.

    Mga halimbawa ng paggamit ng lifecycleScope

    Tingnan natin ang tatlong totoong senaryo ng paggamit ng lifecycleScope sa isang Android application sa Kotlin.

    Halimbawa 1: Subscription sa mga update sa lokasyon kapag nakikita lamang ang screen

    kotlin
    class MapFragment : Fragment() {
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            lifecycleScope.launch {
                repeatOnLifecycle(Lifecycle.State.STARTED) {
                    locationProvider.observeLocation().collect { loc ->
                        updateMapMarker(loc)
                    }
                }
            }
        }
    }

    Magsisimula ang coroutine kapag naging nakikita ang fragment (STARTED) at kinakansela kapag umalis ito sa screen (STOPPED). Kung lumipat ang user sa ibang application, ang mga update sa lokasyon ay hindi kumokonsumo ng baterya.

    Halimbawa 2: Pagpapatakbo ng animation sa pagsisimula ng fragment

    kotlin
    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.RESUMED) {
            animateFadeIn(titleView)
            delay(200)
            animateSlideUp(contentView)
        }
    }

    Ang animation ay tumatakbo lamang kapag ang fragment ay nasa foreground (RESUMED). Kung i-minimize ng user ang application habang tumatakbo ang animation, kinakansela ang coroutine, at sa pagbabalik ay magsisimula muli ang animation.

    Halimbawa 3: Pana-panahong pag-sync ng data sa nakikitang screen

    kotlin
    lifecycleScope.launch {
        repeatOnLifecycle(Lifecycle.State.STARTED) {
            while (isActive) {
                syncData()
                delay(30_000L)
            }
        }
    }

    Naka-sync ang data bawat 30 segundo, ngunit kapag nakikita lamang ang screen. Sinusuri ng isActive kung hindi kinansela ang coroutine, na tinitiyak ang ligtas na paglabas mula sa loop kapag umalis sa screen.

    lifecycleScope vs viewModelScope: mga senaryo ng aplikasyon

    Ang parehong scope ay nakaugnay sa lifecycle, ngunit sa magkaibang aspeto nito. Ang pag-unawa sa pagkakaiba ay kritikal para sa tamang arkitektura ng mga Android application.

    Pangunahing pagkakaiba

    viewModelScope ay nakaugnay sa ViewModel, na nabubuhay sa pag-ikot ng screen. lifecycleScope ay nakaugnay sa LifecycleOwner (Activity/Fragment), na sa pag-ikot ay nawasak at muling nilikha. Tinutukoy nito ang mga senaryo ng kanilang aplikasyon.

    Kailan gagamitin ang lifecycleScope

    • Subscription sa mga system event (lokasyon, sensor, camera)
    • Mga animation at UI effect na nakaugnay sa isang partikular na screen
    • Pag-load ng data ng naka-chunk na isinasaalang-alang ang visibility ng screen
    • Mga operasyon na dapat huminto kapag umalis sa screen

    Kailan gagamitin ang viewModelScope

    • Pag-load ng data mula sa Repository
    • Business logic na dapat mabuhay sa pag-ikot
    • Caching at pagproseso ng data
    • Anumang operasyon na ang resulta ay kailangan pagkatapos ng pag-ikot

    Pinagsamang paggamit

    Sa praktika, ang kumbinasyon ng parehong scope ay madalas na makita: viewModelScope ay naglo-load ng data at namamahala ng estado, lifecycleScope ay nag-subscribe sa Flow mula sa ViewModel na isinasaalang-alang ang lifecycle ng screen. Ang paghihiwalay na ito ng responsibilidad ay itinuturing na best practice sa modernong pag-develop ng Android.

    Mga karaniwang pagkakamali sa paggamit ng lifecycleScope

    Tingnan natin ang apat na pinakakaraniwang pagkakamali na ginagawa ng mga developer kapag gumagamit ng lifecycleScope.

    Pagkakamali 1: Paggamit ng lifecycleScope sa halip na viewModelScope para sa pag-load ng data

    Kung sisimulan mo ang pag-load ng data sa lifecycleScope.launch, sa pag-ikot ng screen ay makakansela ang coroutine at kailangang i-load muli ang data. Gumamit ng viewModelScope para sa matagal na operasyon. lifecycleScope — para lamang sa mga gawaing nauugnay sa UI.

    Pagkakamali 2: Pagkolekta ng Flow nang walang repeatOnLifecycle

    Ang direktang tawag sa viewModel.someFlow.collect { ... } sa loob ng lifecycleScope.launch ay patuloy na nangongolekta ng data kahit hindi nakikita ang screen. Ito ay maaaring humantong sa mga update ng UI sa background at hindi kinakailangang overhead. Laging gamitin ang repeatOnLifecycle o flowWithLifecycle.

    Pagkakamali 3: Pagkalimot sa pagkansela kapag umalis sa screen

    Bagama't kinakansela ang lifecycleScope sa DESTROYED, ang code pagkatapos ng suspend point ay maaaring hindi maisakatuparan sa biglaang pagkansela. Huwag umasa sa pagpapatupad ng code pagkatapos ng suspend call, maliban kung gumagamit ka ng NonCancellable.

    Pagkakamali 4: Paggamit ng lumang launchWhenStarted sa halip na repeatOnLifecycle

    Ang launchWhenStarted at mga analog nito ay hindi kinakansela ang coroutine, pinapa-pause lamang ito. Kung ang screen ay lumipat nang maraming beses sa pagitan ng foreground at background, ang coroutine ay nag-iipon ng mga ipinagpaliban na tawag. Lumipat sa repeatOnLifecycle — ito ang tanging tamang paraan ng pag-sync sa Lifecycle.

    Mga Madalas Itanong

    Ano ang pagkakaiba ng lifecycleScope at GlobalScope?

    lifecycleScope ay awtomatikong kinakansela kapag nawasak ang LifecycleOwner. GlobalScope ay nabubuhay sa buong panahon ng pagpapatakbo ng application. Ang coroutine sa lifecycleScope ay hindi maaaring mag-update ng UI pagkatapos ng pagkasira ng component, sa GlobalScope ay maaari, na humahantong sa mga crash. Laging gamitin ang lifecycleScope sa UI layer.

    Maaari bang gamitin ang lifecycleScope sa ViewModel?

    Hindi, ang ViewModel ay hindi LifecycleOwner, kaya hindi available ang lifecycleScope dito. Ang ViewModel ay gumagamit ng viewModelScope. Kung ang code ay dapat isagawa sa parehong konteksto — i-extract ang logic sa use case o repository na may mga suspend function.

    Ano ang mangyayari kapag paulit-ulit na tinawag ang repeatOnLifecycle?

    Ang bawat tawag sa repeatOnLifecycle ay lumilikha ng bagong coroutine na nagpapatakbo ng block kapag naabot ang tinukoy na estado ng Lifecycle. Kung ang repeatOnLifecycle ay tinawag nang dalawang beses para sa parehong estado, ang parehong block ay tatakbo nang hiwalay. Karaniwan ang isang tawag sa onViewCreated ay sapat na.

    Maaari bang magtakda ng custom na Dispatcher para sa lifecycleScope?

    Hindi direktang mababago ang dispatcher ng lifecycleScope — gumagamit ito ng Dispatchers.Main.immediate. Sa loob ng coroutine block, maaari kang lumipat sa ibang dispatcher sa pamamagitan ng withContext. Para sa mga pagsubok, gamitin ang TestDispatcher kasama ng LifecycleOwner.

    Kinakansela ba ang lifecycleScope sa onPause o onDestroy?

    Kinakansela ang lifecycleScope kapag lumipat ang LifecycleOwner sa estado na DESTROYED (pagkatapos ng onDestroy). Ang mga simpleng tawag sa lifecycleScope.launch ay hindi kinakansela sa onPause o onStop. Para mag-pause kapag pumunta sa background, gamitin ang repeatOnLifecycle(STARTED) o repeatOnLifecycle(RESUMED).

    Buod

    • lifecycleScope — CoroutineScope na nakaugnay sa LifecycleOwner, awtomatikong kinakansela sa DESTROYED sa pamamagitan ng LifecycleEventObserver
    • Dispatchers.Main.immediate — default na dispatcher na tinitiyak ang ligtas na pag-update ng UI nang walang hindi kinakailangang paglipat
    • repeatOnLifecycle — modernong API para sa pagpapatakbo ng mga coroutine sa isang tinukoy na estado ng Lifecycle na may awtomatikong pagkansela at pag-restart
    • flowWithLifecycle — operator para sa ligtas na pagkolekta ng Flow mula sa UI na isinasaalang-alang ang lifecycle
    • launchWhenStarted ay luma na — sa halip na i-pause, gamitin ang repeatOnLifecycle na kinakansela ang coroutine, hindi ito pinapa-pause
    • lifecycleScope vs viewModelScope — lifecycleScope para sa mga operasyon ng UI (animation, lokasyon), viewModelScope para sa data at business logic
    • Pag-ikot ng screen — kinakansela ang lifecycleScope sa pag-ikot, pinapanatili ang viewModelScope; pumili ng scope depende sa gawain

    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.

    Pag-usapan ang proyekto

    Basahin din