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 ve kullanıcı etkileşimine tam olarak izin veren yüksek güç durumu.
- Ortam: 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 saati gösterme gibi içeriklerle kaplama yaparak 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 plandayken sistem, kullanıcı etkin olmaması nedeniyle tetiklenen iki zaman aşımına göre güç durumu geçişlerini yönetir.
- 1. Zaman Aşımı: Etkileşimli durumdan Ortam durumuna: Kullanıcı belirli bir süre işlem yapmadığında cihaz Ortam durumuna geçer.
- Zaman aşımı #2: Kadranına 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 daha yeni bir sürümü 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 durumu için davranışı özelleştirme
Varsayılan sistem davranışından bağımsız olarak, tüm Wear OS sürümlerinde durum geçişlerinde geri çağırmaları dinlemek için AmbientLifecycleObserver kullanarak Ortam durumundayken uygulamanızın görünümünü veya davranışını özelleştirebilirsiniz. Bu durum, aşağıdaki akış şemasında "Ambiactive Mode" düğümüyle gösterilir.
AmbientLifecycleObserver'ı kullanma
Ambiyans modu etkinliklerine tepki vermek için AmbientLifecycleObserver sınıfını kullanın:
AmbientLifecycleObserver.AmbientLifecycleCallbackarayüzünü uygulayın. Kullanıcı arayüzünüzü düşük güç durumuna göre ayarlamak içinonEnterAmbient()yöntemini, tam etkileşimli ekrana geri yüklemek için iseonExitAmbient()yöntemini kullanın.val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
AmbientLifecycleObserveroluşturun ve bunu etkinliğinizin veya composable'ınızın yaşam döngüsüne kaydedin.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
removeObserver(),onDestroy()gözlemcisini kaldırmak için çağrılır.override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(ambientObserver) // ... }
Jetpack Compose kullanan geliştiriciler için Horologist kitaplığı, bu kalıbın uygulanmasını kolaylaştıran AmbientAware composable'ı gibi faydalı bir yardımcı program sunar.
Ortama duyarlı TimeText
Özel gözlemci gerektirme kuralının istisnası olarak Wear OS 6'da TimeText widget'ı ortam farkındadır. Cihaz Ortam durumundayken ek kod olmadan dakikada bir otomatik olarak güncellenir.
Ortam davranışı akış şeması
Aşağıdaki akış şeması, sistemin cihazın Wear OS sürümüne, uygulamanızın targetSdkVersion özelliğine ve AmbientLifecycleCallback özelliğini uygulayıp uygulamadığına göre ortam davranışını nasıl belirlediğini gösterir.
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 kadran ekranına dönmeyi engelleme
Ortam durumunda belirli bir süre geçtikten sonra (2. zaman aşımı) sistem genellikle saat yüzüne 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 seansı) 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ılar manuel olarak saat yüzüne dönerse devam eden etkinlik göstergesi, uygulamanıza tek dokunuşla dönmelerini 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 durumunu önleme
Nadir durumlarda, cihazın Ambiyans durumuna girmesini tamamen engellemeniz gerekebilir. Yani 1. zaman aşımını önlemek için. Bunu yapmak için FLAG_KEEP_SCREEN_ON pencere işaretini 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 aşağıdaki 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.
- 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.
- Düz renkli büyük bloklar ve işlevsel olmayan markalama veya arka plan resimleri kullanmaktan kaçının.
- Eski dinamik verileri işleme
onUpdateAmbient()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 hatalı bilgilerin gösterilmesini önlemek içinonEnterAmbientgeri çağırma işlevini dinleyin ve bu canlı değerleri--gibi statik yer tutucu içeriklerle değiştirin.
- Tutarlı bir düzen kullanın
- Sorunsuz bir geçiş oluşturmak için Etkileşimli ve Ortam modlarında öğeleri aynı konumda tutun.
- Saati her zaman gösterin.
- Bağlama duyarlı olun
- Cihaz ortam moduna girdiğinde kullanıcı 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 özel koşulları ele alma
onEnterAmbient()yöntemine iletilenAmbientDetailsnesnesinde:deviceHasLowBitAmbienttrueise mümkün olduğunda kenar yumuşatma özelliğini devre dışı bırakın.burnInProtectionRequiredtrueise ekran yanmasını önlemek için kullanıcı arayüzü öğelerini düzenli olarak hafifçe kaydırın ve tamamen beyaz alanlardan kaçının.
Hata ayıklama ve test
Bu adb komutlar, cihaz ortam modundayken uygulamanızın 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şleri sırasında görünür kalmalı ve kadranla değiştirilmemelidir.
Bunu yapmak için geliştiricinin şunları yapması gerekir:
- Ekranı karartma ve gerekli olmayan verileri kaldırma gibi Etkileşimli ve Ortam durumları arasındaki kullanıcı arayüzü değişikliklerini işlemek için
AmbientLifecycleObserveruygulayın. - Ortam durumu için en iyi uygulamalara uygun yeni bir düşük güç tüketen düzen oluşturun.
- 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 AmbientAware Horologist kitaplığından composable'ın kullanımı da gösterilmektedir.