Wear OS cihazlar genellikle egzersiz takibi gibi uzun süren deneyimler için kullanılır. Bu deneyimler, kullanıcının önemsediği ve hızlı erişmek istediği önemli bilgileri de sağlayabilir.
Bu durum, kullanıcı deneyimi açısından bir sorun teşkil eder: Bir göreve başlayan ve ardından saat yüzüne giden kullanıcıların aşağıdaki işlemlerin her birini yapabilmesi gerekir:
- Önemli güncellemeleri almaya devam edebilirsiniz.
- Tek dokunuşla göreve geri dönün.
Başlatıcıyı kullanarak uygulamaya dönmek, özellikle hareket halindeyken zor olabilir ve gereksiz sürtünme yaratır.
Wear OS 7'den itibaren çözüm, devam eden bir bildirimi OngoingActivity veya Canlı Güncelleme bildirimi ile eşlemektir. Bu sayede cihaz, uzun süren etkinliklerle ilgili bilgileri kullanıcı arayüzünde gösterebilir. Böylece, saat yüzünün alt kısmındaki dokunulabilir simge gibi özellikler etkinleştirilir. Bu gösterge, kullanıcıları arka plan görevi hakkında bilgilendirir ve uygulamaya tek dokunuşla dönme olanağı sunar.
Devam eden bir etkinlik veya Anlık Bilgilendirme de uygulamanızın daha uzun süre görünür kalmasını sağlar ve sistemin belirli bir süre işlem yapılmadığında kadranına dönmesini engeller. Daha fazla bilgi için Uygulamanızı Wear'da görünür tutma başlıklı makaleyi inceleyin.
Bir dakikadan uzun sürmesi muhtemel deneyimler veya kullanıcının görev tamamlanmadan önce uygulamanızdan ayrılma olasılığının yüksek olduğu durumlarda devam eden etkinlik veya Canlı Güncelleme bildirimi kullanın.
Uygun kullanım alanları: Takip edilen egzersizler, zamanlayıcılar, etkin araç paylaşımı takibi, toplantı gibi daha uzun ses kayıtları ve kullanıcı mağazadayken kullanılabilmesi gereken alışveriş listeleri
Uygunsuz kullanımlar: Kısa sesli mesajlar, promosyonlar, güncellenen bir uygulamanın durumu ve yaklaşan takvim etkinlikleri kaydetme.
Önemli: Bu senaryolarda
OngoingActivityveya Canlı Güncelleme kullanmak, Wear OS Uygulama Kalitesi Kuralları WO-V4 kapsamında zorunludur.
Örneğin, bu antrenman uygulamasında bilgiler, kullanıcının saat yüzünde dokunulabilir bir koşu simgesi olarak görünebilir:
Şekil 1. Etkinlik göstergesi.
Devam eden bir bildirim, genel uygulama başlatıcının Son Kullanılanlar bölümünde de bilgi gösterir. Bu sayede kullanıcılar, görevlerinin durumunu görebilecekleri ve uygulamayla yeniden etkileşim kurabilecekleri başka bir uygun yer elde eder:
Şekil 2. Global başlatıcı.
Aşağıdaki durumlarda, Devam Eden Etkinlik ile ilişkili devam eden bir bildirim kullanmak iyi bir fikirdir:
Şekil 3. Zamanlayıcı: Zamanı aktif olarak geri sayar ve duraklatıldığında veya durdurulduğunda sona erer.
Şekil 4. Adım adım navigasyon: Hedefe giden yol tarifini sesli olarak bildirir. Kullanıcı hedefe ulaştığında veya navigasyonu durdurduğunda sona erer.
Şekil 5. Medya: Oturum boyunca müzik çalar. Kullanıcı oturumu duraklattıktan hemen sonra sona erer.
Wear, medya uygulamaları için otomatik olarak Devam Eden Etkinlikler oluşturur.
Diğer uygulama türleri için Devam Eden Etkinlikler oluşturmayla ilgili ayrıntılı bir örnek için Devam Eden Etkinlik codelab'ine bakın.
Kurulum
Ongoing Activity API'yi uygulamanızda kullanmaya başlamak için uygulamanızın build.gradle dosyasına aşağıdaki bağımlılıkları ekleyin:
dependencies {
implementation "androidx.wear:wear-ongoing:1.1.0"
implementation "androidx.core:core:1.19.0"
}
Devam eden etkinlik oluşturma
Bu süreç üç adımdan oluşur:
- Standart bir
NotificationCompat.Builderoluşturun ve bunu devam eden olarak yapılandırın. - Bildirim oluşturucuyu ileterek bir
OngoingActivitynesnesi oluşturun ve yapılandırın. - Devam Eden Etkinlik'i bildirim oluşturucuya uygulayın ve sonuçta elde edilen bildirimi yayınlayın.
Bildirimi oluşturma ve yapılandırma
NotificationCompat.Builder oluşturarak başlayın. Önemli adım, setOngoing(true) işlevini çağırarak bildirimi devam eden bildirim olarak işaretlemektir. Bu aşamada küçük simge ve kategori gibi diğer bildirim özelliklerini de ayarlayabilirsiniz.
// Create a PendingIntent to pass to the notification builder val pendingIntent = PendingIntent.getActivity( this, 0, Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("Always On Service") .setContentText("Service is running in background") .setSmallIcon(R.drawable.animated_walk) // Category helps the system prioritize the ongoing activity .setCategory(NotificationCompat.CATEGORY_WORKOUT) .setContentIntent(pendingIntent) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setOngoing(true) // Important!
OngoingActivity oluşturma
Ardından, oluşturucusunu kullanarak OngoingActivity örneği oluşturun. OngoingActivity.Builder için Context, bildirim kimliği ve önceki adımda oluşturduğunuz NotificationCompat.Builder gerekir.
Yeni kullanıcı arayüzü yüzeylerinde gösterilecek anahtar özelliklerini yapılandırın:
- Animasyonlu ve statik simgeler: Etkin ve ambiyans modlarında kadran üzerinde gösterilen simgeler sağlayın.
- Dokunma amacı: Kullanıcı, Devam Eden Etkinlik simgesine dokunduğunda onu uygulamanıza geri getiren bir
PendingIntent. Önceki adımda oluşturulanpendingIndentyeniden kullanabilirsiniz.
val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // Sets the icon that appears on the watch face in active mode. .setAnimatedIcon(R.drawable.animated_walk) // Sets the icon that appears on the watch face in ambient mode. .setStaticIcon(R.drawable.ic_walk) // Sets the tap target to bring the user back to the app. .setTouchIntent(pendingIntent) .build()
Bildirime ve gönderiye uygula
Son adım, OngoingActivity ile bildirimi bağlayıp yayınlamaktır. ongoingActivity.apply() yöntemi, orijinal bildirim oluşturucuyu değiştirerek gerekli verileri ekler. Böylece sistem, bildirimi ek yüzeylerde gösterebilir. Bu özelliği uyguladıktan sonra bildirimi her zamanki gibi oluşturup yayınlayabilirsiniz.
// This call modifies notificationBuilder to include the ongoing activity data. ongoingActivity.apply(applicationContext) // Post the notification. startForeground(NOTIFICATION_ID, notificationBuilder.build())
Başlatıcıya dinamik durum metni ekleme
Yukarıdaki kod, dokunulabilir simgeyi kol saatine ekler. Başlatıcının Son Kullanılanlar bölümünde daha da zengin ve anlık güncellemeler sunmak için Status nesnesi oluşturup OngoingActivity öğenize ekleyin. Özel bir Status sağlamazsanız sistem varsayılan olarak bildirimin içerik metnini (setContentText() kullanılarak ayarlanır) kullanır. Dinamik metin görüntülemek için Status.Builder kullanın. Yer tutucular içeren bir şablon dizesi tanımlayabilir ve bu yer tutucuları doldurmak için Status.Part nesneleri sağlayabilirsiniz. Status.Part, kronometre veya zamanlayıcı gibi dinamik olabilir.
Aşağıdaki örnekte, "[Kronometre] için koş" ifadesini gösteren bir durumun nasıl oluşturulacağı gösterilmektedir:
// Define a template with placeholders for the activity type and the timer. val statusTemplate = "#type# for #time#" // Set the start time for a stopwatch. // Use SystemClock.elapsedRealtime() for time-based parts. val runStartTime = SystemClock.elapsedRealtime() val ongoingActivityStatus = Status.Builder() // Sets the template string. .addTemplate(statusTemplate) // Fills the #type# placeholder with a static text part. .addPart("type", Status.TextPart("Run")) // Fills the #time# placeholder with a stopwatch part. .addPart("time", Status.StopwatchPart(runStartTime)) .build()
Son olarak, Status cihazını OngoingActivity cihazınıza bağlamak için OngoingActivity.Builder üzerinden setStatus() numarasını arayın.
val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // Add the status to the OngoingActivity. .setStatus(ongoingActivityStatus) .build()
Ek özelleştirmeler
Status dışında, Devam Eden Etkinliğinizi veya bildirimlerinizi aşağıdaki şekillerde özelleştirebilirsiniz. Ancak bu özelleştirmeler, OEM'nin uygulamasına bağlı olarak kullanılmayabilir.
Devam eden bildirim
- Ayarlanan kategori, Devam Eden Etkinliğin önceliğini belirler.
CATEGORY_CALL: Gelen sesli veya görüntülü görüşme ya da benzer bir eşzamanlı iletişim isteğiCATEGORY_NAVIGATION: Harita veya adım adım navigasyonCATEGORY_TRANSPORT: Oynatma için medya taşıma kontrolüCATEGORY_ALARM: alarm veya zamanlayıcıCATEGORY_WORKOUT: AntrenmanCATEGORY_LOCATION_SHARING: Geçici konum paylaşımı kategorisiCATEGORY_STOPWATCH: Kronometre
Devam Eden Etkinlik
Animasyonlu simge: Tercihen şeffaf arka planı olan siyah beyaz bir vektör. Etkin modda kadran üzerinde gösterilir. Animasyonlu simge sağlanmazsa varsayılan bildirim simgesi kullanılır. Varsayılan bildirim simgesi her uygulama için farklıdır.
Statik simge: Şeffaf arka plana sahip bir vektör simgesi. Ambiyans modunda kadran üzerinde gösterilir. Hareketli simge ayarlanmamışsa etkin modda kadran üzerinde statik simge kullanılır. Bu sağlanmazsa bildirim simgesi kullanılır. İkisi de ayarlanmamışsa istisna oluşturulur. (Uygulama başlatıcı, uygulama simgesini kullanmaya devam eder.)
OngoingActivityStatus: Düz metin veya
Chronometer. Uygulama başlatıcının Son Kullanılanlar bölümünde gösterilir. Belirtilmezse bildirimin "bağlam metni" kullanılır.Dokunma Amacı: Kullanıcı Devam Eden Etkinlik simgesine dokunduğunda uygulamaya geri dönmek için kullanılan bir
PendingIntent. Kadranda veya başlatıcı öğesinde gösterilir. Uygulamayı başlatmak için kullanılan orijinal amaçtan farklı olabilir. Bu bilgi sağlanmazsa bildirimin içerik amacı kullanılır. İkisi de ayarlanmamışsa istisna oluşturulur.LocusId: Devam eden etkinliğin karşılık geldiği başlatıcı kısayolunu atayan kimlik. Etkinlik devam ederken başlatıcıdaki Son Arananlar bölümünde gösterilir. Belirtilmezse başlatıcı, Son Kullanılanlar bölümündeki aynı pakete ait tüm uygulama öğelerini gizler ve yalnızca Devam Eden Etkinliği gösterir.Devam Eden Etkinlik Kimliği: Bir uygulamada birden fazla Devam Eden Etkinlik olduğunda
fromExistingOngoingActivity()çağrılarını netleştirmek için kullanılan kimlik.
Devam Eden Bir Etkinliği Güncelleme
Durumu değiştirmeniz gerektiğinde yeni bir bildirim ve devam eden etkinlik oluşturmak yerine mevcut bildirimin devam eden etkinliğini güncellemeniz gerekir. Devam eden etkinliği ve yayınlanan bildirimi güncellemek için daha önce oluşturduğunuz nesneyi kullanın ve aşağıdaki örnekte gösterildiği gibi update() işlevini çağırın:
ongoingActivity.update(context, newStatus)
OngoingActivity'ye referans depolamanın mümkün olmadığı durumlarda OngoingActivity'yi kurtarmak için statik bir yöntem vardır. Ancak bu yöntem daha az tercih edilir:
OngoingActivity.recoverOngoingActivity(context) ?.update(context, newStatus)
Devam Eden Bir Etkinliği Durdurma
Uygulama, Devam Eden Etkinlik olarak çalışmayı tamamladığında yalnızca devam eden bildirimi iptal etmesi gerekir.
Ayrıca, bildirim veya Devam Eden Etkinlik ön plana geldiğinde bunları iptal edip arka plana döndüğünüzde yeniden oluşturmayı da seçebilirsiniz ancak bu işlem zorunlu değildir.
Devam Eden Bir Etkinliği Duraklatma
Uygulamanızda açık bir durdurma işlemi varsa devam eden etkinliği duraklatma işlemi kaldırıldıktan sonra devam ettirin. Açıkça durdurma işlemi olmayan bir uygulamada, etkinlik duraklatıldığında sonlandırılır.
Önemli noktalar
Devam Eden Etkinlik API'si ile çalışırken aşağıdaki noktaları unutmayın:
Devam Eden Etkinliğiniz için açıkça veya bildirim kullanılarak yedek olarak statik bir simge ayarlayın. Aksi takdirde
IllegalArgumentExceptionalırsınız.Şeffaf arka planlı siyah beyaz vektör simgeler kullanın.
Devam Eden Etkinliğiniz için açıkça veya bildirimi kullanarak yedek olarak dokunma amacı ayarlayın. Aksi takdirde
IllegalArgumentExceptionalırsınız.Uygulamanızın manifest dosyasında birden fazla
MAIN LAUNCHERetkinliği varsa dinamik kısayol yayınlayın veLocusIdkullanarak Devam Eden Etkinliğinizle ilişkilendirin.
Wear OS cihazlarda medya oynatılırken medya bildirimleri yayınlama
Wear OS cihazda medya içeriği oynatılıyorsa medya bildirimi yayınlayın. Bu sayede sistem, ilgili devam eden etkinliği oluşturabilir.
Media3 kullanıyorsanız bildirim otomatik olarak yayınlanır. Bildiriminizi manuel olarak oluşturursanız MediaStyleNotificationHelper.MediaStyle kullanılmalı ve ilgili MediaSession öğesinin oturum etkinliği doldurulmalıdır.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Bildirim oluşturma {:#notification}
- Ongoing Activity API ile Wear OS kullanıcılarıyla yeni yollardan etkileşim kurma
- Genişletilebilir bildirim oluşturma {:#expandable-notification}