lifecycleScope, androidx.lifecycle kütüphanesinden yerleşik bir CoroutineScope’tur, bir Activity, Fragment veya herhangi bir LifecycleOwner’ın yaşam döngüsüne bağlıdır ve bileşen yok edildiğinde coroutine’ları otomatik olarak iptal eder. Google Android Developers, 2025’e göre lifecycleScope, Activity veya Fragment yok edildikten sonra kod çalıştırma riski olmadan UI katmanıyla ilgili coroutine’ları güvenle başlatmanıza olanak tanır. LifecycleOwner DESTROYED durumuna geçtiğinde scope otomatik olarak iptal edilir.
Anahtar noktalar
lifecycleScope, LifecycleOwner arayüzünde (Activity, Fragment, Service) bir uzantı özelliğidir ve bileşenin tam yaşam döngüsüne bağlı, hazır bir CoroutineScope sağlar. LifecycleOwner DESTROYED durumuna ulaştığında, lifecycleScope tüm etkin coroutine’ları otomatik olarak iptal eder.
// In Fragment or Activity
lifecycleScope.launch {
delay(1000)
showSnackbar("Merhaba!")
}
viewModelScope’un aksine, lifecycleScope LifecycleOwner her yok edildiğinde iptal edilir — ekran döndürme dahil. Bu, onu yalnızca belirli bir ekran görünürken yaşaması gereken işlemler için ideal hale getirir.
lifecycleScope, LifecycleOwner’ın olduğu her yerde kullanılabilir:
lifecycleScope’un otomatik iptal mekanizması, Lifecycle olaylarına abone olmaya dayanır. Lifecycle, CREATED’ın altına DESTROYED’a düştüğünde, scope iptal edilir.
| Durum | Açıklama | Scope etkin |
|---|---|---|
| CREATED | LifecycleOwner oluşturuldu, onCreate çalıştırıldı | Evet |
| STARTED | LifecycleOwner görünür (onStart) | Evet |
| RESUMED | LifecycleOwner ön planda (onResume) | Evet |
| DESTROYED | LifecycleOwner yok edildi (onDestroy) | Hayır (scope iptal edildi) |
lifecycleScope, CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) olarak oluşturulur ve Lifecycle içinde saklanır. Lifecycle DESTROYED durumuna geçtiğinde, scope.cancel() çağrılır. Mekanizma, scope’a ilk erişimde yaşam döngüsü olaylarına abone olan LifecycleEventObserver aracılığıyla uygulanır.
Ekran döndürüldüğünde, Activity yok edilir (onDestroy) ve yeniden oluşturulur. lifecycleScope, eski Activity ile birlikte iptal edilir ve yeni Activity için yeni bir scope örneği oluşturulur. Bu, döndürmede hayatta kalan viewModelScope’dan temel bir farktır.
lifecycle kütüphanesi, lifecycleScope aracılığıyla coroutine başlatmanın birkaç yolunu sağlar. API’nin kullanımdan kaldırılmış yöntemlerden moderne evrimini inceleyelim.
En basit yol lifecycleScope.launch { ... }’dir. Coroutine hemen başlar ve DESTROYED’da iptal edilir. Ancak, UI görünür olmasa bile kod çalıştırabilir (örneğin, onStop’tan sonra arka planda). Bu her zaman istenen bir durum değildir.
Bu yöntemler, Lifecycle belirtilen durumun altına düştüğünde coroutine yürütmesini duraklatır ve geri dönüşte devam ettirirdi. Ancak, lifecycle-runtime-ktx 2.6.0’da @Deprecated olarak işaretlendiler çünkü:
repeatOnLifecycle, Google tarafından yaşam döngüsüyle senkronize edilmiş coroutine’ları başlatmak için önerilen yöntemdir. Lifecycle belirtilen duruma her ulaştığında coroutine’u iptal eder ve yeniden başlatır.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
updateUI(state)
}
}
}
repeatOnLifecycle’a aktarılan coroutine, Lifecycle STARTED’a ulaştığında başlar ve STARTED’ın altına düştüğünde iptal edilir. STARTED’a geri dönüldüğünde, coroutine baştan yeniden başlar. Bu güvenli ve verimlidir — hiçbir coroutine askıda kalmaz.
Yaşam döngüsü farkındalığıyla Flow’dan veri toplamak için flowWithLifecycle operatörü vardır. Lifecycle durumu değiştiğinde toplamayı otomatik olarak durdurur ve devam ettirir:
viewModel.uiState
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
.onEach { state -> updateUI(state) }
.launchIn(lifecycleScope)
flowWithLifecycle operatörü, UI katmanında bir Flow’a güvenle abone olmanın en kısa yoludur.
Kotlin ile bir Android uygulamasında lifecycleScope kullanımının üç gerçek senaryosunu inceleyelim.
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)
}
}
}
}
}
Coroutine, fragment görünür hale geldiğinde (STARTED) başlar ve ekrandan ayrıldığında (STOPPED) iptal edilir. Kullanıcı başka bir uygulamaya geçerse, konum güncellemeleri pil tüketmez.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
animateFadeIn(titleView)
delay(200)
animateSlideUp(contentView)
}
}
Animasyon yalnızca fragment ön plandayken (RESUMED) çalışır. Kullanıcı animasyon sırasında uygulamayı küçültürse, coroutine iptal edilir ve geri dönüldüğünde animasyon yeniden başlar.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
while (isActive) {
syncData()
delay(30_000L)
}
}
}
Veriler her 30 saniyede bir senkronize edilir, ancak yalnızca ekran görünürken. isActive, coroutine’un iptal edilip edilmediğini kontrol ederek ekrandan ayrılırken döngüden güvenli bir çıkış sağlar.
Her iki scope da yaşam döngüsüne bağlıdır, ancak farklı yönlerine. Farkı anlamak, doğru Android uygulama mimarisi için kritiktir.
viewModelScope, ekran döndürmede hayatta kalan ViewModel’e bağlıdır. lifecycleScope, döndürmede yok edilen ve yeniden oluşturulan LifecycleOwner’a (Activity/Fragment) bağlıdır. Bu, kullanım senaryolarını belirler.
Pratikte, her iki scope’un birleşimi yaygındır: viewModelScope verileri yükler ve durumu yönetirken, lifecycleScope yaşam döngüsü farkındalığıyla ViewModel’den Flow’a abone olur. Bu sorumluluk ayrımı, modern Android geliştirmede en iyi uygulama olarak kabul edilir.
lifecycleScope kullanırken geliştiricilerin yaptığı en yaygın dört hatayı inceleyelim.
lifecycleScope.launch içinde veri yükleme başlatırsanız, ekran döndürmede coroutine iptal edilir ve verilerin yeniden yüklenmesi gerekir. Uzun süreli işlemler için viewModelScope kullanın. lifecycleScope yalnızca UI’ya bağlı görevler içindir.
lifecycleScope.launch içinde doğrudan viewModel.someFlow.collect { ... } çağırmak, ekran görünür olmasa bile veri toplamaya devam eder. Bu, arka planda UI güncellemelerine ve gereksiz yüke neden olabilir. Her zaman repeatOnLifecycle veya flowWithLifecycle kullanın.
lifecycleScope DESTROYED’da iptal edilse de, ani iptalde askı noktasından sonraki kod çalışmayabilir. NonCancellable kullanmıyorsanız, bir suspend çağrısından sonraki kod yürütmesine güvenmeyin.
launchWhenStarted ve benzerleri coroutine’u iptal etmez, yalnızca duraklatır. Ekran ön plan ve arka plan arasında birkaç kez geçiş yaparsa, coroutine ertelenmiş çağrıları biriktirir. repeatOnLifecycle’a geçin — Lifecycle ile senkronize olmanın tek doğru yolu budur.
Sıkça sorulan sorular
lifecycleScope, LifecycleOwner yok edildiğinde otomatik olarak iptal edilir. GlobalScope, uygulama çalıştığı sürece yaşar. lifecycleScope’taki bir coroutine, bileşen yok edildikten sonra UI’yı güncelleyemezken, GlobalScope’taki güncelleyebilir ve bu da çökmelere neden olur. UI katmanında her zaman lifecycleScope kullanın.
Hayır, ViewModel bir LifecycleOwner değildir, bu nedenle lifecycleScope içinde kullanılamaz. ViewModel, viewModelScope kullanır. Kodun her iki bağlamda da çalışması gerekiyorsa, mantığı suspend işlevleriyle bir use case veya repository’ye çıkarın.
repeatOnLifecycle’a yapılan her çağrı, belirtilen Lifecycle durumuna ulaşıldığında bloğu çalıştıran yeni bir coroutine oluşturur. Aynı durum için repeatOnLifecycle iki kez çağrılırsa, her iki blok da bağımsız olarak çalışır. Genellikle onViewCreated içinde tek bir çağrı yeterlidir.
lifecycleScope dağıtıcısını doğrudan değiştiremezsiniz — Dispatchers.Main.immediate kullanır. Coroutine bloğu içinde, withContext aracılığıyla başka bir dağıtıcıya geçebilirsiniz. Testler için, LifecycleOwner ile TestDispatcher kullanın.
lifecycleScope, LifecycleOwner DESTROYED durumuna (onDestroy’den sonra) geçtiğinde iptal edilir. Basit lifecycleScope.launch çağrıları onPause veya onStop’ta iptal edilmez. Arka plana geçerken duraklatmak için repeatOnLifecycle(STARTED) veya repeatOnLifecycle(RESUMED) kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun