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:

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 ViewModel kullanmalı ve değişiklikleri kullanıcı arayüzüne yansıtmak için bir StateFlow gö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ı ViewModel sı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, ViewModel verileri 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 collectAsStateWithLifecycle kullanın. Yaşam döngüsü etkinliklerine göre toplama işlemini manuel olarak başlatmayın veya durdurmayın. Flow Bunun yerine, akışları verimli bir şekilde kullanıcı arayüzü durumuna dönüştürmek için collectAsStateWithLifecycle kullanın. Uygulama arka planda olduğunda Flow duraklatı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çin LifecycleStartEffect kullanı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çin LifecycleResumeEffect kullanı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 collectAsStateWithLifecycle kullanı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 LifecycleResumeEffect kullanı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: LifecycleStartEffect gibi efektlerle temizleme bloğunuz (onStopOrDispose), yaşam döngüsü STOPPED aş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