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 — 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.
// 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 LifecycleOwner olan hər yerdə mövcuddur:
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.
| Vəziyyət | Təsvir | Scope aktivdir |
|---|---|---|
| CREATED | LifecycleOwner yaradılıb, onCreate icra olunub | Bəli |
| STARTED | LifecycleOwner görünür (onStart) | Bəli |
| RESUMED | LifecycleOwner ön plandadır (onResume) | Bəli |
| DESTROYED | LifecycleOwner məhv edilib (onDestroy) | Xeyr (scope ləğv olunub) |
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.
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.
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.
Ə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.
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:
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.
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.
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:
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.
Kotlin ilə Android tətbiqində lifecycleScope-un üç real ssenarisini nəzərdən keçirək.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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 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ə
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