Karolarda düzenli güncellemeleri göster

Zaman geçtikçe değişen içeriklere sahip öğeler oluşturun.

Zaman çizelgeleriyle çalışma

Zaman çizelgesi, her biri belirli bir zaman aralığında gösterilen bir düzen içeren bir veya daha fazla TimelineEntry örneğinden oluşur. Tüm kutular için zaman çizelgesi gerekir.

Parça zaman çizelgesi diyagramı

Tek girişli kutular

Bir karo genellikle tek bir TimelineEntry ile tanımlanabilir. Düzen sabittir ve yalnızca düzenin içindeki bilgiler değişir. Örneğin, gün içindeki fitness ilerlemenizi gösteren bir kutucuk, farklı değerler göstermek için düzeni ayarlayabilmenize rağmen her zaman aynı ilerleme düzenini gösterir. Bu gibi durumlarda, içeriğin ne zaman değişebileceğini önceden bilemezsiniz.

Tek bir TimelineEntry içeren bir kutu örneği için aşağıya bakın:

override fun onTileRequest(
    requestParams: RequestBuilders.TileRequest
): ListenableFuture<Tile?> {
    val tile =
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            // We add a single timeline entry when our layout is fixed, and
            // we don't know in advance when its contents might change.
            .setTileTimeline(Timeline.fromLayoutElement(simpleLayout(this)))
            .build()
    return Futures.immediateFuture(tile)
}

Zaman sınırlı zaman çizelgesi girişleri

Bir TimelineEntry, isteğe bağlı olarak geçerlilik süresi tanımlayabilir. Bu sayede uygulama yeni bir kutu göndermeden kutunun düzeni bilinen bir zamanda değiştirilebilir.

Kanonik örnek, zaman çizelgesinde yaklaşan etkinliklerin listesini içeren bir gündem kutusudur. Yaklaşan her etkinlikte, ne zaman gösterileceğini belirten bir geçerlilik süresi bulunur.

Tiles API, geçerlilik sürelerinin çakışmasına izin verir. Bu durumda, kalan süresi en kısa olan ekran gösterilir. Aynı anda yalnızca bir etkinlik gösterilir.

Geliştiriciler, varsayılan bir yedek giriş sağlayabilir. Örneğin, aşağıdaki kod örneğinde gösterildiği gibi, başka bir zaman çizelgesi girişi geçerli değilse kullanılan, geçerlilik süresi sınırsız olan bir kartı gündem kartı içerebilir:

override fun onTileRequest(
    requestParams: RequestBuilders.TileRequest
): ListenableFuture<Tile?> {
    val timeline = Timeline.Builder()

    // Add fallback "no meetings" entry
    // Use the version of TimelineEntry that's in androidx.wear.protolayout.
    timeline.addTimelineEntry(
        TimelineBuilders.TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build()
    )

    // Retrieve a list of scheduled meetings
    val meetings = MeetingsRepo.getMeetings()
    // Add a timeline entry for each meeting
    meetings.forEach { meeting ->
        timeline.addTimelineEntry(
            TimelineBuilders.TimelineEntry.Builder()
                .setLayout(getMeetingLayout(meeting))
                .setValidity(
                    // The tile should disappear when the meeting begins
                    // Use the version of TimeInterval that's in
                    // androidx.wear.protolayout.
                    TimelineBuilders.TimeInterval.Builder()
                        .setEndMillis(meeting.dateTimeMillis)
                        .build()
                )
                .build()
        )
    }

    val tile =
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setTileTimeline(timeline.build())
            .build()
    return Futures.immediateFuture(tile)
}

Kartı yenileme

Bir kutucukta gösterilen bilgilerin süresi bir süre sonra dolabilir. Örneğin, gün boyunca aynı sıcaklığı gösteren bir hava durumu kutucuğu doğru değildir.

Süresi dolan verilerle başa çıkmak için kutu oluşturulurken geçerlilik aralığı belirleyin. Bu aralık, kutunun ne kadar süreyle geçerli olacağını belirtir. Hava durumu kutucuğu örneğinde, aşağıdaki kod örneğinde gösterildiği gibi içeriğini her saatte bir güncelleyebilirsiniz:

override fun onTileRequest(
    requestParams: RequestBuilders.TileRequest
): ListenableFuture<Tile?> =
    Futures.immediateFuture(
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
            .setTileTimeline(Timeline.fromLayoutElement(getWeatherLayout()))
            .build()
    )

Bir yenilik aralığı ayarladığınızda sistem, aralık bittikten kısa süre sonra onTileRequest() işlevini çağırır. Yenilik aralığı ayarlamazsanız sistem onTileRequest() işlevini çağırmaz.

Bir kart, harici bir etkinlik nedeniyle de geçerliliğini yitirebilir. Örneğin, bir kullanıcı takviminden bir toplantıyı kaldırabilir. Döşeme yenilenmezse döşemede silinen toplantı gösterilmeye devam eder. Bu durumda, aşağıdaki kod örneğinde gösterildiği gibi, uygulama kodunuzun herhangi bir yerinden yenileme isteğinde bulunun:

fun eventDeletedCallback() {
     TileService.getUpdater(context)
             .requestUpdate(MyTileService::class.java)
}

Bir güncelleme iş akışı seçin

Kutucuk güncellemelerinizi nasıl yapılandıracağınızı belirlemek için aşağıdaki en iyi uygulamalardan yararlanın:

  • Güncelleme tahmin edilebilirse (ör. kullanıcının takvimindeki bir sonraki etkinlik içinse) zaman çizelgesi kullanın.
  • Platform verilerini getirirken sistemin verileri otomatik olarak güncellemesi için veri bağlamayı kullanın.
  • Güncelleme, cihaz üzerinde kısa bir süre içinde hesaplanabiliyorsa (ör. gün doğumu kutusundaki bir resmin konumunu güncelleme) onTileRequest() kullanın.

    Bu yöntem, özellikle tüm resimleri önceden oluşturmanız gerektiğinde faydalıdır. Gelecekte yeni bir resim oluşturmanız gerekirse setFreshnessIntervalMillis() numaralı telefonu arayın.

  • Hava durumu verileri için yoklama yapma gibi daha yoğun arka plan çalışmalarını tekrar tekrar yapıyorsanız WorkManager kullanın ve kutunuza güncellemeler gönderin.

  • Güncelleme, ışıkların açılması, e-posta alınması veya notun güncellenmesi gibi harici bir etkinliğe yanıt olarak yapılıyorsa uygulamanızı tekrar etkin hale getirmek için Firebase Cloud Messaging (FCM) mesajı gönderin, ardından güncellemeleri kutucuğa gönderin.

  • Döşeme verilerini senkronize etme işlemi maliyetli olabilecekse aşağıdakileri yapın:

    1. Veri senkronizasyonu planlayın.
    2. 1-2 saniyelik zamanlayıcı başlatın.
    3. Süre dolmadan önce uzak bir veri kaynağından güncelleme alırsanız veri senkronizasyonundan güncellenen değeri gösterin. Aksi takdirde, yerel olarak önbelleğe alınmış bir değer gösterin.