Her zaman açık uygulamalar ve sistem ambiyans modu

Bu kılavuzda, uygulamanızı her zaman açık tutma, güç durumu geçişlerine tepki verme ve pilden tasarruf ederken iyi bir kullanıcı deneyimi sunmak için uygulama davranışını yönetme konuları açıklanmaktadır.

Bir uygulamanın sürekli görünür olması pil ömrünü önemli ölçüde etkiler. Bu nedenle, bu özelliği eklerken güç tüketimini göz önünde bulundurun.

Temel Kavramlar

Wear OS uygulaması tam ekranda gösterildiğinde iki güç durumundan birinde olur:

  • Etkileşimli: Ekranın tam parlaklıkta olduğu, kullanıcı etkileşimine tam olarak izin veren yüksek güç durumu.
  • Ambiyans: Ekranın güç tasarrufu için karartıldığı düşük güç durumu. Bu durumda, uygulamanızın kullanıcı arayüzü tam ekranı kaplamaya devam eder ancak sistem, bulanıklaştırma veya saat gibi yer paylaşımı içerikleri göstererek görünümünü değiştirebilir. Bu özellik Ambiyans Modu olarak da adlandırılır.

Bu durumlar arasındaki geçişi işletim sistemi kontrol eder.

Sürekli Açık Uygulama, içeriği hem Etkileşimli hem de Ambiyans durumunda gösteren bir uygulamadır.

Her zaman açık olan bir uygulama, cihaz düşük güçteki Ambiyans durumundayken kendi kullanıcı arayüzünü göstermeye devam ettiğinde ambiactive modunda olduğu açıklanır.

Sistem geçişleri ve varsayılan davranış

Bir uygulama ön planda olduğunda sistem, kullanıcı etkin olmadığında tetiklenen iki zaman aşımına göre güç durumu geçişlerini yönetir.

  • Zaman aşımı 1: Etkileşimli durumdan Ortam durumuna: Kullanıcı bir süre işlem yapmadığında cihaz Ortam durumuna geçer.
  • Zaman aşımı #2: Kadrana dönme: Belirli bir süre işlem yapılmadığında sistem, mevcut uygulamayı gizleyip kadranı gösterebilir.

Sistem, Ambient durumuna ilk geçişi yaptıktan hemen sonra varsayılan davranış, Wear OS sürümüne ve uygulamanızın yapılandırmasına bağlıdır:

  • Wear OS 5 ve önceki sürümlerde sistem, duraklatılmış uygulamanızın bulanık bir ekran görüntüsünü gösterir ve bu ekran görüntüsünün üzerine saat bilgisi eklenir. Bu durum, aşağıdaki akış şemasında "AOD Lite" düğümüyle gösterilir.
  • Wear OS 6 ve sonraki sürümlerde, SDK 36 veya sonraki sürümleri hedefleyen uygulamalar her zaman açık olarak kabul edilir. Ekran karartılır ancak uygulama çalışmaya ve görünür kalmaya devam eder. (Güncellemeler dakikada bir kez kadar seyrek olabilir.) Bu durum, aşağıdaki akış şemasında "Global AOD" düğümüyle gösterilir.

Ambiyans durumunun davranışını özelleştirme

Varsayılan sistem davranışından bağımsız olarak, tüm Wear OS sürümlerinde Ambient durumundayken uygulamanızın görünümünü veya davranışını özelleştirebilirsiniz. Bunun için Wear OS'te Jetpack Compose'daki durum geçişlerini gözlemlemek üzere LocalAmbientModeManager kullanın. Bu durum, aşağıdaki akış şemasında "Ambiactive Mode" düğümüyle gösterilir.

Ortam durumunu gözlemleme

Wear OS'te Jetpack Compose'daki ambiyans modu etkinliklerine tepki vermek için:

  1. Sistemin ortam modu durumundaki değişiklikleri gözlemlemek için LocalAmbientModeManager kullanın ve composable'larınızı buna göre ayarlayın. Bileşeninizi AmbientMode.Ambient durumunda daha düşük güç moduna ayarlanacak ve AmbientMode.Interactive durumunda tam etkileşimli ekrana geri yüklenecek şekilde yapılandırın.

    // In a production application, the AmbientModeManager should be instantiated and provided at
    // the highest level of the Compose hierarchy (typically in the host Activity's setContent
    // block) using a CompositionLocalProvider. This ensures proper lifecycle management and
    // broad accessibility.
    
    // For this self-contained demo, AmbientModeManager is created and provided locally:
    val activityAmbientModeManager = rememberAmbientModeManager()
    CompositionLocalProvider(LocalAmbientModeManager provides activityAmbientModeManager) {
        val ambientModeManager = LocalAmbientModeManager.current
        val ambientMode = ambientModeManager?.currentAmbientMode
    
        if (ambientModeManager != null) {
            ambientModeManager.AmbientTickEffect {
                // While device is in ambient mode, update properties every minute or so
                // ...
            }
        }
    
        // ...
            val ambientModeName =
                when (ambientMode) {
                    is AmbientMode.Interactive -> "Interactive"
                    is AmbientMode.Ambient -> "Ambient"
                    else -> "Unknown"
                }
    
            Text(text = "$ambientModeName Mode")
            // ...
    }

Ortam davranışı akış şeması

Aşağıdaki akış şeması, sistemin cihazın Wear OS sürümüne, uygulamanızın targetSdkVersion değerine ve ortam durumu geçişlerini (LocalAmbientModeManager veya AmbientLifecycleCallback kullanarak) gözlemleyip gözlemlemediğine bağlı olarak ortam davranışını nasıl belirlediğini gösterir.

Wear OS ambiyans modunun karar mantığını gösteren bir akış şeması. Cihazın işletim sistemi sürümü ile uygulamanın yapılandırmasının, üç sonuçtan birini (bulanık yer paylaşımı, Global AOD veya uygulama tarafından yönetilen Ambiactive Modu) nasıl belirlediğini gösterir.
Şekil 1.: Wear OS'teki ambiyans modunun karar mantığını gösteren bir akış şeması.

Ekranın açık kalma süresini kontrol etme

Aşağıdaki bölümlerde, uygulamanızın ekranda kalma süresini nasıl yöneteceğiniz açıklanmaktadır.

Devam eden etkinlik veya canlı güncelleme ile kadrana dönmeyi engelleme

Ortam durumunda belirli bir süre geçtikten sonra (2. zaman aşımı) sistem genellikle kadranına geri döner. Kullanıcı, sistem ayarlarında zaman aşımı süresini yapılandırabilir. Kullanıcının egzersiz takibi gibi belirli kullanım alanlarında uygulamanın daha uzun süre görünür kalması gerekebilir.

Wear OS 5 ve sonraki sürümlerde OngoingActivity uygulayarak bunu önleyebilirsiniz. Uygulamanız, devam eden bir kullanıcı göreviyle (ör. antrenman oturumu) ilgili bilgiler gösteriyorsa görev sona erene kadar uygulamanızın görünür kalmasını sağlamak için Ongoing Activity API'yi kullanabilirsiniz. Kullanıcı manuel olarak kadranına dönerse devam eden etkinlik göstergesi, uygulamanıza tek dokunuşla dönmesini sağlar.

Alternatif olarak, Wear OS 7 ve sonraki sürümlerde, Devam Eden Etkinlik yerine Canlı Güncelleme kullanabilirsiniz. Geriye dönük uyumluluk için Wear OS 6 veya önceki sürümlerin yüklü olduğu cihazlarda Devam Eden Etkinlik'i desteklemeye devam edin.

Bunu uygulamak için devam eden bildirimin dokunma intent'i, aşağıdaki kod snippet'inde gösterildiği gibi her zaman açık etkinliğinizi işaret etmelidir:

val activityIntent =
    Intent(this, AlwaysOnActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
    }

val pendingIntent =
    PendingIntent.getActivity(
        this,
        0,
        activityIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
        // ...
        // ...
        .setOngoing(true)

// ...

val ongoingActivity =
    OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder)
        // ...
        // ...
        .setTouchIntent(pendingIntent)
        .build()

ongoingActivity.apply(applicationContext)

val notification = notificationBuilder.build()

Ekranı açık tutma ve Ambiyans Modu'nu önleme

Nadir durumlarda, cihazın Ambiyans durumuna girmesini tamamen engellemeniz gerekebilir. Yani 1. zaman aşımını önlemek için. Bunu yapmak için keepScreenOn değiştiricisini kullanabilirsiniz. Bu işlev, cihazı Etkileşimli durumda tutarak uyandırma kilidi olarak çalışır. Bu özelliği kullanırken çok dikkatli olun. Pil ömrünü ciddi şekilde etkiler.

Ambiyans modu için öneriler

En iyi kullanıcı deneyimini sunmak ve Ortam modunda güç tasarrufu sağlamak için bu tasarım kurallarına uyun. Bu öneriler, yanıltıcı bilgileri önleyerek ve görsel karmaşayı azaltarak net bir kullanıcı deneyimine öncelik verirken aynı zamanda görüntüleme gücünü de optimize eder.

  • Görsel karmaşayı azaltın ve gücü görüntüleyin. Temiz ve minimalist bir kullanıcı arayüzü, uygulamada düşük güç durumu olduğunu kullanıcıya bildirir ve parlak pikselleri sınırlayarak önemli ölçüde pil tasarrufu sağlar.
    • Ekranın en az% 85'ini siyah tutun (piksel oranı% 15 veya daha az olmalıdır).
    • Yalnızca en kritik bilgileri gösterin ve ikincil ayrıntıları etkileşimli ekrana taşıyın.
    • Büyük simgeler veya düğmeler için düz dolgular yerine ana hatlar kullanın. Ana hat kontrastını, öğeler okunabilirliğini koruyacak ve ekran titremesi veya yanma riskini önleyecek şekilde ayarlayın.
    • Düz renkli büyük bloklar ve işlevsel olmayan markalama veya arka plan resimleri kullanmaktan kaçının.
  • Eski dinamik verileri ve animasyonları işleme
    • AmbientTickEffect geri çağırma işlemi, güç tasarrufu için yalnızca belirli aralıklarla (genellikle dakikada bir kez) çağrılır. Bu sınırlama nedeniyle, kronometre, nabız veya antrenman mesafesi gibi sık değişen veriler güncellemeler arasında eski hale gelir. Yanlış ve yanıltıcı bilgilerin gösterilmesini önlemek için bu canlı değerleri -- gibi statik yer tutucu içeriklerle değiştirin.
    • Kullanıcının mevcut bağlamı veya durumu için yararlı olması amacıyla sık sık güncellenmesi gereken ilerleme göstergelerini (ör. kısa medya oturumları için ilerleme halkaları) kaldırın. Dakikada bir yapılan güncellemelerin hâlâ değer sağladığı durumlarda (ör. uzun zamanlayıcılar) ilerleme göstergelerini koruyabilirsiniz.
    • Ortam modunda, animasyonlu ilerleme göstergeleri ve kayan metin dahil olmak üzere tüm animasyonları duraklatın veya kaldırın.
  • Tutarlı bir düzen kullanın
    • Sorunsuz bir geçiş için Etkileşimli ve Ortam modlarında öğeleri aynı konumda tutun. Modern Wear OS cihazlar, ortam oturumları sırasında dokunma girişini desteklediğinden düğmeler gibi etkileşimli kullanıcı arayüzü öğeleri görünür kalabilir.
    • Her zaman geçerli saati gösterir. Wear OS için Jetpack Compose'da TimeText (ScreenScaffold içinde varsayılan olarak bulunur) ortamdan haberdardır ve ortam modunda dakikada bir kez otomatik olarak güncellenir.
  • Bağlama duyarlı olun
    • Kullanıcı, cihaz ortam moduna girdiğinde bir ayarlar veya yapılandırma ekranındaysa ayarlar görünümü yerine uygulamanızdan daha alakalı bir ekran göstermeyi düşünebilirsiniz.
  • Cihaza özgü koşulları ele alma
    • currentAmbientMode döndürüldüğünde AmbientMode.Ambient:
      • isLowBitAmbientSupported true ise ekran, ekran ambiyansı modunda renk başına daha az bit destekler. Kenar yumuşatma özelliğini devre dışı bırakın (ör. özel Canvas veya Paint çizim işlemlerinde) ve mümkün olduğunda renk gradyanlarından kaçının.
      • isBurnInProtectionRequired true ise sistem, ekran yanmasını önlemek için ekran içeriğini düzenli olarak kaydırır. Uygulamanızdaki kullanıcı arayüzü öğelerini manuel olarak kaydırmayın. Bunun yerine, düz beyaz alanlardan kaçının ve önemli kullanıcı arayüzü öğelerini ekranın kenarından en az 10 piksel uzağa yerleştirin. Böylece, sistem ekranı kaydırdığında bu öğeler kırpılmaz. (ScreenScaffold gibi standart Wear Compose düzenleri zaten yeterli kenar boşluğu sağlar.)

Hata ayıklama ve test

Bu adb komutlar, uygulamanızın cihaz ortam modundayken nasıl davrandığını geliştirirken veya test ederken faydalı olabilir:

# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP

# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP

Örnek: Antrenman uygulaması

Egzersiz oturumunun tamamı boyunca kullanıcılara metrik göstermesi gereken bir egzersiz uygulamasını ele alalım. Uygulama, ortam durumu geçişlerinde görünür kalmalı ve saat yüzüyle değiştirilmemelidir.

Bunun için geliştiricinin aşağıdakileri yapması gerekir:

  1. Ekranı karartma ve gereksiz verileri kaldırma gibi Etkileşimli ve Ortam durumları arasındaki kullanıcı arayüzü değişikliklerini işlemek için LocalAmbientModeManager kullanın.
  2. Ortam durumu için en iyi uygulamalara uygun yeni bir düşük güç tüketen düzen oluşturun.
  3. Sistemin saat yüzüne dönmesini önlemek için egzersiz süresince Ongoing Activity API'yi (veya Wear OS 7 ve sonraki sürümlerde Canlı Güncellemeler'i) kullanın.

Tam uygulama için GitHub'daki Compose tabanlı Exercise örneğine bakın. Bu örnekte, Compose'da ortam modu işlemeyi basitleştirmek için LocalAmbientModeManager composable'ın kullanımı da gösterilmektedir.