👨🏼‍💻 Jetpack Compose’da Yaşam Döngüsü Entegrasyonu: Ekran Görüntüsü Alma Devre Dışı Bırakma

Ahmet Furkan Sevim
Huawei Developers - Türkiye
3 min readFeb 16, 2024
Jetpack Compose ile Yaşam Döngüsüne Entegrasyonu

Giriş

Güvenlik gereksinimleri doğrultusunda, yeni bir proje geliştirirken belirli ekranlarda ekran görüntüsü almayı devre dışı bırakma ihtiyacı ortaya çıktı. Bu bağlamda, Android uygulamamızın geliştirilme sürecini daha verimli ve etkili hale getirmek için Jetpack Compose’u tercih ettik.

Ancak, tek bir composable ekran için ekran görüntüsü alma özelliğini devre dışı bırakma konusunda bazı zorluklar yaşadık. Jetpack Compose’daki @Composable fonksiyonlar, varsayılan olarak lifecycle bilincine sahip değildir. Bu tür olayları gözlemlemek için ekstra bir fonksiyon yazmak gereklidir.

Bu makalede, Composablelar’ı lifecycle bilincine nasıl getireceğimizi ve belirli bir ekran için ekran görüntüsü almayı nasıl engelleyeceğimizi detaylı bir şekilde açıklayacağım. Keyifli okumalar!

1. Lifecycle-aware Components

Koda geçmeden önce, “lifecycle-aware” kavramını keşfedelim. Android Framework’te tanımlanan uygulama bileşenlerinin çoğunun yaşam döngüleri vardır. Yaşam döngüleri, işletim sistemi veya uygulama çalışırken framework kodu tarafından yönetilir.

Android’in çalışma temelini oluşturan yaşam döngüleri, uygulamaların düzgün çalışmasını sağlayan kritik bir unsurdur. Uygulamalar, bu yaşam döngülerine uyum sağlamalıdır. Çünkü bu döngülere uyum sağlamamak, bellek sızıntılarına neden olabilir ve hatta uygulamanın çökmesine yol açabilir.

“Life-cycle”, bir bileşenin (örneğin activity veya fragment) yaşam döngüsü durumunu belirten ve diğer nesnelerin bu durumu gözlemlemesine izin veren bir sınıftır. Lifecycle, bu durumu izlemek için iki ana unsur kullanır:

  • Event (Olay): Framework ve Lifecycle sınıfından gönderilen yaşam döngüsü olaylarını ifade eder. Bu olaylar, aktiviteler ve fragmentlerdeki geri çağırma olaylarına karşılık gelir.
  • State (Durum): Bu, Lifecycle nesnesi tarafından takip edilen bileşenin mevcut durumunu temsil eder.

2. Composable Lifecycle

Composable fonksiyonları lifecycle bilincine sahip yapmak için bir yardımcı fonksiyon eklememiz gerekiyor. Bu fonksiyon, Compose hiyerarşisinde belirli bir LifecycleOwner’ın yaşam döngüsü olaylarını gözlemlememizi sağlayacak.

@Composable
fun ComposableLifeCycle(
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
onEvent: (LifecycleOwner, Lifecycle.Event) -> Unit
) {
// If `lifecycleOwner` changes, dispose and reset the effect
DisposableEffect(key1 = lifecycleOwner) {
val observer = LifecycleEventObserver { source, event ->
onEvent(source, event)
}
lifecycleOwner.lifecycle.addObserver(observer)
        onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
}
}

lifecycleOwner: İzlenen yaşam döngüsü olaylarının sahibi olan LifecycleOwner nesnesini temsil eder. Varsayılan olarak, bu, mevcut yerel yaşam döngüsü sahibini temsil eden LocalLifecycleOwner.current'dır.

onEvent: Bir yaşam döngüsü olayı gerçekleştiğinde çağrılacak bir lambda fonksiyonudur. Bu, olayın kaynağı olan LifecycleOwner nesnesini ve gerçekleşen olayı temsil eden Lifecycle.Event'i alır.

3. Nasıl Kullanılır: Tek Bir Ekran İçin Ekran Görüntülerini Devre Dışı Bırakma

Şimdi, önceki bölümde tanımladığımız yardımcı fonksiyonu nasıl kullanacağımızı keşfedelim. Makalenin başında dediğim gibi, bu fonksiyonu kullanarak, belirli bir ekranda ekran görüntüsü almayı devre dışı bırakmayı göstereceğim.

@Composable
fun ProtectedScreen(modifier: Modifier = Modifier) {
    val activity = LocalContext.current.findActivity()    ComposableLifeCycle { source, event ->
when (event) {
Lifecycle.Event.ON_START-> {
activity.window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE
)
}
Lifecycle.Event.ON_PAUSE -> {
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
else -> {}
}
}
Text(text = "Screen B")
}

val activity = LocalContext.current.findActivity(): Ekranın bulunduğu aktiviteyi alan extension function.

ComposableLifeCycle { source, event -> ... }: Bu, önceki açıklanan ComposableLifeCycle fonksiyonunun kullanımı. ProtectedScreen composable’ının yaşam döngü olaylarını gözlemler. Lambda içinde, iki belirli yaşam döngü olayını kontrol eder:

  • Lifecycle.Event.ON_START: Composable başladığında (yani, görünür hale geldiğinde), ekran görüntülerini devre dışı bırakmak için activity.window.setFlags(...) kullanarak pencereye bir bayrak ayarlar.
  • Lifecycle.Event.ON_PAUSE: Composable duraklatıldığında (örneğin, başka bir etkinlik öne çıktığında), ekran görüntülerine izin vermek için activity.window.clearFlags(...) kullanarak bayrağı temizler.
  • else -> {} bloğu diğer yaşam döngü olaylarını ele alır, ancak bu senaryo için boştur.

4. Ekran Görüntüsü

İşlevselliği göstermek için ekran kaydı aldım. Korunan ekranın ekran görüntüsünü almaya çalışırken, video siyah hale geliyor.

Sonuç

Sonuç

Bu yazımda ComposableLifeCycle işlevi ile yaşam döngüsü farkındalığını entegre ederek, Jetpack Compose projesinde tek bir ekran için ekran görüntüsü işlevselliğini başarıyla devre dışı bıraktık.

Tam kodu burada bulabilirsiniz.

Referanslar

--

--