Jetpack Compose'da yaşam döngüsü Android Jetpack'in bir parçasıdır.
Yaşam döngüsünden haberdar bileşenler, ana etkinliğin yaşam döngüsü durumundaki bir değişikliğe yanıt olarak işlemler gerçekleştirir. androidx.lifecycle.compose yapısı, ekrandan çıktıklarında veya uygulama arka plana geçtiğinde kaynakları otomatik olarak temizleyen özel API'ler sağlar.
Başlıca API'ler şunlardır:
- Mevcut
Lifecycle.Stateiçin akışlar. LifecycleEffects, belirli birLifecycle.Eventtemelinde bir blok çalıştırmanıza olanak tanır.
Bu entegrasyonlar, Compose hiyerarşisinde yaşam döngülerini yönetmek için uygun kancalar sağlar. Bu belgede, bunları uygulamanızda nasıl kullanabileceğiniz açıklanmaktadır.
Akışlarla yaşam döngüsü durumu toplama
Lifecycle, mevcut currentStateFlow değerini Kotlin StateFlow olarak sağlayan bir Lifecycle.State özelliği kullanıma sunar. Bu Flow öğesini State olarak toplayabilirsiniz. Bu, uygulamanızın oluşturma sırasında yaşam döngüsündeki değişiklikleri okumasına olanak tanır.
val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()
Önceki örneğe lifecycle-common modülü kullanılarak erişilebilir. currentStateAsState() yöntemi, lifecycle-runtime-compose modülünde kullanılabilir. Bu yöntem, tek bir satırla mevcut yaşam döngüsü durumunu kolayca okumanıza olanak tanır. Aşağıdaki örnekte bu durum gösterilmektedir:
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
Yaşam döngüsü etkinliklerinde kod çalıştırma
DefaultLifecycleObserver uygulayan ayrı bir sınıf oluşturup bunu yaşam döngüsüne manuel olarak eklemek yerine, yaşam döngüsü mantığını belirli efektleri kullanarak satır içi olarak tanımlayabilirsiniz. LifecycleEffects, belirli bir Lifecycle.Event doğrudan beste içinde gerçekleştiğinde bir blok çalıştırmanıza olanak tanır.
LifecycleEventEffect
Belirli bir etkinlik gerçekleştiğinde bir kod bloğunu çalıştırmak için LifecycleEventEffect kullanın. Bu, başarı veya anında sonuç gerektirmeyen günlük kaydı ya da analiz gibi tek seferlik etkinlikler için en iyisidir.
@Composable
fun AnalyticsTracker(screenName: String) {
// Log an event when the app receives ON_RESUME (e.g. comes to foreground)
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
Analytics.logView(screenName)
}
}
LifecycleStartEffect
Uygulama başlatıldığında (görünür) çalışması ve uygulama durdurulduğunda (arka planda) temizlenmesi gereken eşleştirilmiş başlatma/durdurma işlemleri için LifecycleStartEffect kullanın.
Diğer Compose efektlerine (ör. LaunchedEffect) benzer şekilde LifecycleStartEffect
anahtarları kabul eder. Anahtar değiştiğinde blok tekrar çalıştırılır.
Bir Lifecycle.Event.ON_STOP etkinliği gerçekleştiğinde veya efekt kompozisyondan çıktığında, başlangıç bloğunun parçası olan tüm işleri temizlemek için onStopOrDispose bloğunu yürütür.
@Composable
fun LocationMonitor(locationManager: LocationManager) {
// Starts monitoring when ON_START is dispatched
// Stops monitoring when ON_STOP is dispatched
// (or the composable leaves the screen)
LifecycleStartEffect(locationManager) {
val listener = LocationListener { location ->
/* update UI */
}
locationManager.requestLocationUpdates(listener)
// The cleanup block automatically runs on ON_STOP or on disposal
onStopOrDispose {
locationManager.removeUpdates(listener)
}
}
}
Diğer yan etki türleri hakkında bilgi edinmek için Compose'daki yan etkiler başlıklı makaleyi inceleyin.
LifecycleResumeEffect
LifecycleResumeEffect, LifecycleStartEffect ile aynı şekilde çalışır ancak bunun yerine Lifecycle.Event.ON_RESUME etkinliğine bağlıdır. Ayrıca, onPauseOrDispose gönderildiğinde veya composable ekrandan ayrıldığında temizleme işlemini gerçekleştiren bir onPauseOrDispose bloğu da sağlar.ON_PAUSE
Bu API, yalnızca kullanıcı uygulamayla etkileşimde bulunurken etkin olması gereken kaynaklar (ör. kameralar veya animasyonlar) için kullanışlıdır.
@Composable
fun CameraPreview(cameraController: CameraController) {
LifecycleResumeEffect(cameraController) {
cameraController.startPreview()
onPauseOrDispose {
cameraController.stopPreview()
}
}
}
LifecycleOwner'a erişme
Oluşturma bölümünde, LifecycleOwner, LocalLifecycleOwner adlı CompositionLocal aracılığıyla dolaylı olarak kullanılabilir. Bestenizin hiyerarşisindeki kök ana makine, varsayılan olarak bu sahibi sağlar.
val lifecycleOwner = LocalLifecycleOwner.current
Birçok uygulama için bu varsayılan sahibin incelenmesi veya yaşam döngüsüne duyarlı efektlere aktarılması yeterlidir. Ancak özel gezinme veya karmaşık düzenler için yaşam döngüsü durumlarını kullanıcı arayüzünün belirli bölümleriyle sınırlamak üzere kendi LifecycleOwner öğenizi oluşturmak isteyebilirsiniz. Örneğin, gezinme kitaplıkları (Navigation
3 gibi) her bir ekrana kendi yaşam döngüsünü vermek için bunu otomatik olarak yapar.
Özel bir LifecycleOwner oluşturma
rememberLifecycleOwner() API, özel bir LifecycleOwner oluşturup hatırlamanıza olanak tanır. Bu, özellikle HorizontalPager gibi bileşenler için yararlıdır. Bu bileşenlerde, yalnızca görünür ve yerleşmiş sayfanın RESUMED olmasını isterken bitişik ekran dışı sayfalar için STARTED değerine sahip bir maxState ayarlarsınız.
val pagerState = rememberPagerState(pageCount = { 10 })
HorizontalPager(state = pagerState) { pageNum ->
val pageLifecycleOwner = rememberLifecycleOwner(
maxState = if (pagerState.settledPage == pageNum) {
Lifecycle.State.RESUMED
} else {
Lifecycle.State.STARTED
}
)
CompositionLocalProvider(LocalLifecycleOwner provides pageLifecycleOwner) {
// Your pages here. Their lifecycle-aware components respect the
// custom maxState defined above.
}
}
CompositionLocal hakkında daha fazla bilgi için Locally scoped data with
CompositionLocal başlıklı makaleyi inceleyin.
Yaşam döngüsüne duyarlı bileşenlerle ilgili en iyi uygulamalar
- Kullanıcı arayüzü denetleyicilerinizi olabildiğince yalın tutun. Kendi verilerini elde etmeye çalışmamalı, bunun yerine
ViewModelkullanmalı ve değişiklikleri kullanıcı arayüzüne yansıtmak için birStateFlowgözlemlemelidir. - Kullanıcı arayüzü denetleyicinizin sorumluluğunun, veriler değiştikçe kullanıcı arayüzünü güncellemek veya kullanıcı işlemlerini
ViewModel'ye geri bildirmek olduğu veriye dayalı kullanıcı arayüzleri yazmaya çalışın. - Veri mantığınızı
ViewModelsınıfınıza yerleştirin.ViewModel, kullanıcı arayüzü denetleyiciniz ile uygulamanızın geri kalanı arasında bağlayıcı görevi görmelidir. Ancak dikkatli olun. Veri getirmek (örneğin, ağdan)ViewModel'in sorumluluğunda değildir. Bunun yerine,ViewModelverileri getirmek için uygun bileşeni çağırmalı ve ardından sonucu kullanıcı arayüzü denetleyicisine geri vermelidir. - Uzun süren görevleri ve eşzamanlı olarak çalıştırılabilen diğer işlemleri yönetmek için Kotlin eş yordamlarını kullanın.
- Başlatma/durdurma mantığını, gerçekten ihtiyaç duyulan composable içinde tutun. Bu şekilde, söz konusu kullanıcı arayüzü öğesi ekrandan kaldırılırsa (ör. bir gezinme grafiğinde veya görünürlük koşullu olduğunda) mantık otomatik olarak kaldırılır.
- Veriler için
collectAsStateWithLifecyclekullanın. Yaşam döngüsü etkinliklerine göre toplama işlemini manuel olarak başlatmayın veya durdurmayın.FlowBunun yerine, akışları verimli bir şekilde kullanıcı arayüzü durumuna dönüştürmek içincollectAsStateWithLifecyclekullanın. Uygulama arka planda olduğundaFlowduraklatıldığı için pil ve kaynak tasarrufu sağlanır.
Flow hakkında daha fazla bilgi için Desteklenen diğer durum türleri başlıklı makaleyi inceleyin.
Yaşam döngüsüne duyarlı bileşenlerin kullanım alanları
Yaşam döngüsüne duyarlı bileşenler, çeşitli durumlarda yaşam döngülerini yönetmenizi çok daha kolay hale getirebilir. Birkaç örnek:
- Kaba ve ayrıntılı konum güncellemeleri arasında geçiş yapma Uygulamanız görünürken (
ON_START) ayrıntılı konum güncellemelerini etkinleştirmek içinLifecycleStartEffectkullanın ve uygulama arka planda olduğunda (ON_STOP) dinleyiciyi otomatik olarak temizleyin veya kaba konum güncellemelerine geçin. - Video arabelleğe almayı durdurma ve başlatma Uygulama tamamen ön planda ve etkileşimli olana kadar (
ON_RESUME) gerçek video oynatmayı ertelemek (LifecycleResumeEffect) ve uygulama arka plana alındığında (ON_PAUSE) oynatmanın duraklatıldığından ve kaynakların serbest bırakıldığından emin olmak içinLifecycleResumeEffectkullanın. - Ağ akışını başlatma ve durdurma Sürekli veri akışlarını (ör. bir ağ soketinden gelen Kotlin akışı) gözlemlemek için
collectAsStateWithLifecyclekullanın. Bu sayede, bir uygulama ön plandayken canlı güncelleme yapabilir ve uygulama arka plana geçtiğinde toplama işlemini otomatik olarak iptal edebilirsiniz. - Yoğun görevleri duraklatma ve devam ettirme Uygulama arka plandayken yoğun görsel güncellemeleri duraklatmak ve uygulama ön plana alındıktan sonra devam ettirmek için
LifecycleResumeEffectkullanın.
ON_STOP etkinliklerini güvenli bir şekilde işleme
Oluşturma, ON_STOP etkinliklerini güvenli bir şekilde işlemek için tasarlanmıştır.
- Durum güvenli: Uygulama arka planda çalışırken bile
MutableState(ör.uiState.value = ...ile) istediğiniz zaman güncelleyebilirsiniz. Compose, değişiklikleri oluşturmak için uygulamanın görünür olmasını bekler. - Otomatik temizleme:
LifecycleStartEffectgibi efektlerle temizleme bloğunuz (onStopOrDispose), yaşam döngüsüSTOPPEDaşamasına geçtiğinde tam olarak çalışır. Bu, uygulama arka plandayken kamera veya konum gibi ağır kaynakları tutmanızı engeller.
MutableState hakkında daha fazla bilgi için Durum ve Jetpack Compose başlıklı makaleyi inceleyin.
Ek kaynaklar
Yaşam döngüsüne duyarlı bileşenlerle yaşam döngülerini işleme hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın.
İçeriği görüntüleme
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- LiveData'ya genel bakış
- Yaşam döngüsüne duyarlı bileşenlerle Kotlin eş yordamlarını kullanma
- ViewModel için Saved State modülü