lifecycleScope — bu nədir, Lifecycle-ə bağlanma və Android-də işləmə

Müəllif: IT Sectr Dərc olunub: 2026-06-23 Oxuma vaxtı: 9 dəq

lifecycleScope — androidx.lifecycle kitabxanasından daxili CoroutineScope-dir, Activity, Fragment və ya hər hansı LifecycleOwner-in həyat dövrünə bağlanır və komponent məhv olduqda korutinləri avtomatik ləğv edir. Google Android Developers, 2025-ə görə, lifecycleScope UI qatı ilə əlaqəli korutinləri Activity və ya Fragment məhv olduqdan sonra kod icra etmək riski olmadan təhlükəsiz işə salmağa imkan verir. Scope LifecycleOwner DESTROYED vəziyyətinə keçdikdə avtomatik ləğv olunur.

Əsas məqamlar

  • lifecycleScope — lifecycle-runtime-ktx-dən CoroutineScope, Lifecycle-in DESTROYED vəziyyətində ləğv olunur
  • lifecycleScope.launch — LifecycleOwner məhv olduqda avtomatik ləğv olunan korutinin işə salınması
  • launchWhenStarted / launchWhenResumed — repeatOnLifecycle ilə əvəz olunmuş köhnəlmiş metodlar
  • repeatOnLifecycle — Lifecycle-in konkret vəziyyətini izləyən korutinləri işə salmaq üçün müasir API
  • Dispatchers.Main.immediate — lifecycleScope üçün standart dispetçer

Android-də lifecycleScope nədir?

lifecycleScope — LifecycleOwner (Activity, Fragment, Service) interfeysinə genişləndirmə xüsusiyyətidir, komponentin tam həyat dövrünə bağlanmış hazır CoroutineScope təmin edir. LifecycleOwner DESTROYED vəziyyətinə çatdıqda, lifecycleScope bütün aktiv korutinləri avtomatik ləğv edir.

kotlin
// Fragment və ya Activity-də
lifecycleScope.launch {
    delay(1000)
    showSnackbar("Salam!")
}

viewModelScope-dən fərqli olaraq, lifecycleScope hər LifecycleOwner məhv olduqda — ekran rotasiyası da daxil olmaqla — ləğv olunur. Bu onu yalnız konkret ekran görünən olduqda yaşamalı olan əməliyyatlar üçün ideal edir.

lifecycleScope harada mövcuddur

lifecycleScope LifecycleOwner olan hər yerdə mövcuddur:

  • Activity — AppCompatActivity LifecycleOwner-dən miras alır
  • Fragment — Fragment LifecycleOwner-dən miras alır
  • LifecycleService — həyat dövrü olan xidmət
  • ProcessLifecycleOwner — bütün tətbiqin həyat dövrü
  • Xüsusi LifecycleOwner — LifecycleOwner-i tətbiq edən istənilən obyektlər

lifecycleScope necə işləyir: Lifecycle və avtomatik ləğv

Avtomatik ləğv mexanizmi Lifecycle hadisələrinə abunəlik əsasında qurulub. Lifecycle CREATED-dən DESTROYED-ə düşdükdə, scope ləğv olunur.

Lifecycle vəziyyətləri

VəziyyətTəsvirScope aktivdir
CREATEDLifecycleOwner yaradılıb, onCreate icra olunubBəli
STARTEDLifecycleOwner görünür (onStart)Bəli
RESUMEDLifecycleOwner ön plandadır (onResume)Bəli
DESTROYEDLifecycleOwner məhv edilib (onDestroy)Xeyr (scope ləğv olunub)

lifecycleScope-un daxili quruluşu

lifecycleScope CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) kimi yaradılır və Lifecycle daxilində saxlanılır. Lifecycle DESTROYED vəziyyətinə keçdikdə scope.cancel() çağırılır. Mexanizm scope-a ilk müraciətdə həyat dövrü hadisələrinə abunə olan LifecycleEventObserver vasitəsilə həyata keçirilir.

Rotasiya zamanı davranış

Ekran döndərildikdə Activity məhv olur (onDestroy) və yenidən yaradılır. lifecycleScope köhnə Activity ilə birlikdə ləğv olunur və yeni Activity üçün yeni scope nümunəsi yaradılır. Bu, rotasiya zamanı qorunan viewModelScope-dən prinsipial fərqdir.

lifecycleScope API: launch, launchWhen və repeatOnLifecycle

Lifecycle kitabxanası lifecycleScope vasitəsilə korutinləri işə salmağın bir neçə yolunu təmin edir. Köhnəlmiş metodlardan müasir olanlara API təkamülünü nəzərdən keçirək.

lifecycleScope.launch — əsas işə salma

Ən sadə yol — lifecycleScope.launch { ... }. Korutin dərhal işə düşür və DESTROYED zamanı ləğv olunur. Lakin UI görünməz olsa belə kod icra edə bilər (məsələn, onStop-dan sonra fon). Bu həmişə arzuolunan deyil.

Köhnəlmiş: launchWhenCreated / launchWhenStarted / launchWhenResumed

Bu metodlar Lifecycle göstərilən vəziyyətdən aşağı düşdükdə korutinin icrasını dayandırır və qayıtdıqda bərpa edirdi. Lakin onlar lifecycle-runtime-ktx 2.6.0-da @Deprecated olaraq qeyd edildi, çünki:

  • Korutini ləğv etmirdi — yalnız dayandırırdı
  • Yaddaş istehlak edən asılı korutinlərin yığılmasına səbəb olurdu
  • Sürətli vəziyyət dəyişmələrində race condition yaradırdı

Müasir API: repeatOnLifecycle

repeatOnLifecycle — Google tərəfindən tövsiyə olunan, həyat dövrü ilə sinxronlaşdırılmış korutinləri işə salma üsuludur. Lifecycle müəyyən edilmiş vəziyyətə çatdıqda korutini ləğv edir və yenidən başladır.

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

repeatOnLifecycle-ə ötürülən korutin Lifecycle STARTED-ə çatdıqda işə düşür və STARTED-dən aşağı düşdükdə ləğv olunur. STARTED-ə qayıtdıqda korutin yenidən başlayır. Bu təhlükəsiz və səmərəlidir — heç bir korutin fasilədə asılı qalmır.

flowWithLifecycle — Flow üçün

Flow-dan həyat dövrü nəzərə alınmaqla məlumat toplamaq üçün flowWithLifecycle operatoru mövcuddur. Lifecycle vəziyyəti dəyişdikdə toplamanı avtomatik dayandırır və bərpa edir:

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

flowWithLifecycle operatoru — UI qatında Flow-a təhlükəsiz abunə olmağın ən qısa yoludur.

lifecycleScope istifadə nümunələri

Kotlin ilə Android tətbiqində lifecycleScope-un üç real ssenarisini nəzərdən keçirək.

Nümunə 1: Yer məlumatı yeniləmələrinə yalnız ekran görünən olduqda abunə olmaq

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)
                }
            }
        }
    }
}

Korutin fraqment görünən olduqda (STARTED) başlayır və ekrandan çıxdıqda (STOPPED) ləğv olunur. İstifadəçi başqa tətbiqə keçərsə, yer yeniləmələri batareya sərf etmir.

Nümunə 2: Fraqment başlayanda animasiyanın işə salınması

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

Animasiya yalnız fraqment ön planda olduqda (RESUMED) işə düşür. İstifadəçi animasiya zamanı tətbiqi bağlasa, korutin ləğv olunur və qayıtdıqda animasiya yenidən başlayır.

Nümunə 3: Görünən ekranda dövri məlumat sinxronizasiyası

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

Məlumat hər 30 saniyədən bir sinxronlaşdırılır, ancaq ekran görünən olduqda. isActive korutinin ləğv edilib-edilmədiyini yoxlayır, bu da ekrandan çıxarkən dövrədən təhlükəsiz çıxışı təmin edir.

lifecycleScope vs viewModelScope: tətbiq ssenariləri

Hər iki scope həyat dövrünə bağlıdır, lakin müxtəlif aspektlərinə. Fərqi başa düşmək Android tətbiqlərinin düzgün arxitekturası üçün kritik əhəmiyyət daşıyır.

Əsas fərq

viewModelScope ekran rotasiyasından sağ çıxan ViewModel-ə bağlıdır. lifecycleScope rotasiya zamanı məhv olan və yenidən yaradılan LifecycleOwner-ə (Activity/Fragment) bağlıdır. Bu onların tətbiq ssenarilərini müəyyən edir.

Nə vaxt lifecycleScope istifadə etməli

  • Sistem hadisələrinə abunəlik (yer, sensorlar, kamera)
  • Konkret ekrana bağlı animasiyalar və UI effektləri
  • Ekran görünməsi nəzərə alınmaqla məlumatın hissə-hissə yüklənməsi
  • Ekrandan çıxışda dayandırılmalı olan əməliyyatlar

Nə vaxt viewModelScope istifadə etməli

  • Repozitordan məlumat yükləmə
  • Rotasiyadan sağ çıxmalı olan biznes məntiqi
  • Məlumatın keşlənməsi və emalı
  • Nəticəsi rotasiyadan sonra lazım olan istənilən əməliyyatlar

Birlikdə istifadə

Praktikada hər iki scope-un kombinasiyası tez-tez rast gəlinir: viewModelScope məlumat yükləyir və vəziyyəti idarə edir, lifecycleScope ViewModel-dən Flow-a ekranın həyat dövrü nəzərə alınmaqla abunə olur. Bu məsuliyyət bölgüsü müasir Android inkişafında best practice hesab olunur.

lifecycleScope ilə işdə tipik səhvlər

Proqramçıların lifecycleScope istifadə edərkən buraxdıqları dörd ən çox yayılmış səhvi nəzərdən keçirək.

Səhv 1: Məlumat yükləmək üçün viewModelScope əvəzinə lifecycleScope istifadə etmək

Məlumat yükləməni lifecycleScope.launch-da işə salsanız, ekran rotasiyası zamanı korutin ləğv olunacaq və məlumatı yenidən yükləmək lazım gələcək. Uzunmüddətli əməliyyatlar üçün viewModelScope istifadə edin. lifecycleScope — yalnız UI ilə bağlı tapşırıqlar üçün.

Səhv 2: repeatOnLifecycle olmadan Flow toplamaq

lifecycleScope.launch daxilində birbaşa viewModel.someFlow.collect { ... } çağırışı ekran görünməz olsa belə məlumat toplamağa davam edir. Bu, fonda UI yeniləmələrinə və lazımsız yükə səbəb ola bilər. Həmişə repeatOnLifecycle və ya flowWithLifecycle istifadə edin.

Səhv 3: Ekrandan çıxışda ləğvi unutmaq

lifecycleScope DESTROYED zamanı ləğv olunsa da, dayandırma nöqtəsindən (suspend) sonrakı kod qəfil ləğvdə icra olunmaya bilər. NonCancellable istifadə etmədikcə, suspend çağırışından sonrakı kodun icrasına güvənməyin.

Səhv 4: repeatOnLifecycle əvəzinə köhnəlmiş launchWhenStarted istifadə etmək

launchWhenStarted və onun analoqları korutini ləğv etmir, yalnız dayandırır. Ekran dəfələrlə ön və fon plan arasında keçid edərsə, korutin təxirə salınmış çağırışları yığır. repeatOnLifecycle-ə keçin — bu, Lifecycle ilə sinxronizasiyanın yeganə düzgün yoludur.

Tez-tez verilən suallar

lifecycleScope və GlobalScope arasında fərq nədir?

lifecycleScope LifecycleOwner məhv olduqda avtomatik ləğv olunur. GlobalScope tətbiqin bütün işləmə müddəti boyunca yaşayır. lifecycleScope-dəki korutin komponent məhv olduqdan sonra UI-ni yeniləyə bilməz, GlobalScope-də isə bilər, bu da səhvlərə səbəb olur. Həmişə UI qatında lifecycleScope istifadə edin.

ViewModel-də lifecycleScope istifadə etmək olarmı?

Xeyr, ViewModel LifecycleOwner deyil, ona görə də lifecycleScope onda mövcud deyil. ViewModel viewModelScope istifadə edir. Kod hər iki kontekstdə icra olunmalıdırsa — məntiqi use case və ya repozitoriyaya suspend funksiyaları ilə çıxarın.

repeatOnLifecycle təkrar çağırıldıqda nə baş verir?

Hər repeatOnLifecycle çağırışı Lifecycle-in müəyyən edilmiş vəziyyətinə çatdıqda bloku işə salan yeni korutin yaradır. repeatOnLifecycle eyni vəziyyət üçün iki dəfə çağırılarsa, hər iki blok müstəqil işə düşəcək. Adətən onViewCreated-də bir dəfə çağırmaq kifayətdir.

lifecycleScope üçün xüsusi Dispatcher təyin etmək olarmı?

Birbaşa lifecycleScope-un dispetçerini dəyişmək olmaz — o, Dispatchers.Main.immediate istifadə edir. Korutin bloku daxilində withContext vasitəsilə başqa dispetçerə keçə bilərsiniz. Testlər üçün LifecycleOwner ilə TestDispatcher istifadə edin.

lifecycleScope onPause və ya onDestroy-də ləğv olunur?

lifecycleScope LifecycleOwner DESTROYED vəziyyətinə keçdikdə (onDestroy-dən sonra) ləğv olunur. Adi lifecycleScope.launch çağırışları onPause və ya onStop-da ləğv olunmur. Fona keçərkən dayandırmaq üçün repeatOnLifecycle(STARTED) və ya repeatOnLifecycle(RESUMED) istifadə edin.

Nəticə

  • lifecycleScope — LifecycleOwner-ə bağlı, LifecycleEventObserver vasitəsilə DESTROYED zamanı avtomatik ləğv olunan CoroutineScope
  • Dispatchers.Main.immediate — lazımsız keçidlər olmadan UI-nin təhlükəsiz yenilənməsini təmin edən standart dispetçer
  • repeatOnLifecycle — Lifecycle-in müəyyən vəziyyətində avtomatik ləğv və yenidən başlatma ilə korutinləri işə salmaq üçün müasir API
  • flowWithLifecycle — həyat dövrü nəzərə alınmaqla UI-dən Flow-un təhlükəsiz toplanması üçün operator
  • launchWhenStarted köhnəlmişdir — dayandırmaq əvəzinə, korutini ləğv edən repeatOnLifecycle istifadə edin
  • lifecycleScope vs viewModelScope — lifecycleScope UI əməliyyatları (animasiyalar, yer) üçün, viewModelScope məlumat və biznes məntiqi üçün
  • Ekran rotasiyası — lifecycleScope rotasiyada ləğv olunur, viewModelScope qalır; tapşırıqdan asılı olaraq scope seçin

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