Karolarda düzenli güncellemeleri göster

Zaman geçtikçe değişen içeriğin bulunduğu karolar oluşturun.

Zaman çizelgeleriyle çalışma

Zaman çizelgesi, bir veya daha fazla TimelineEntry örnekten oluşur. Bu örneklerin her biri, belirli bir zaman aralığında görüntülenen bir düzen içerir. Tüm karoların zaman çizelgesi gereklidir.

Karo zaman çizelgesi şeması

Tek girişli karolar

Bir karo genellikle tek bir TimelineEntry ile açıklanabilir. Düzen sabitlenir ve yalnızca düzen içindeki bilgiler değişir. Örneğin, gün içinde form koruma ilerleme durumunuzu gösteren bir kutu her zaman aynı ilerleme düzenini gösterir ancak bu düzeni farklı değerler gösterecek şekilde ayarlayabilirsiniz. Bu durumlarda, içeriğin ne zaman değişeceğini önceden bilemezsiniz.

Tek bir TimelineEntry içeren karo örneğini aşağıda bulabilirsiniz:

Kotlin

override fun onTileRequest(
    requestParams: 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(...)
        ).build()
    return Futures.immediateFuture(tile)
}

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
   Tile tile = new 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(...)
       ).build();
   return Futures.immediateFuture(tile);
}

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

TimelineEntry, isteğe bağlı olarak geçerlilik süresi tanımlayabilir. Bu sayede, uygulamanın yeni bir kart aktarmasına gerek kalmadan karo, bilinen bir zamanda düzenini değiştirebilir.

Standart örnek, zaman çizelgesi yaklaşan etkinliklerin listesini içeren bir gündem kutusudur. Yaklaşan her etkinlik, ne zaman gösterileceğini belirten bir geçerlilik süresi içerir.

Kartlar API'si, çakışan geçerlilik dönemlerine olanak tanır. Bu dönemlerde, kalan en kısa süreye sahip ekran gösterilir. Aynı anda yalnızca bir etkinlik gösterilir.

Geliştiriciler varsayılan bir yedek giriş sağlayabilir. Örneğin, gündem kutusu sınırsız geçerlilik süresine sahip bir kutu olabilir. Bu kutu, aşağıdaki kod örneğinde gösterildiği gibi başka bir zaman çizelgesi girişi geçerli değilse kullanılır:

Kotlin

public override fun onTileRequest(
    requestParams: 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(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(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.
                TimeInterval.Builder()
                    .setEndMillis(meeting.dateTimeMillis).build()
            ).build()
        )
    }

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

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull RequestBuilders.TileRequest requestParams
) {
   Timeline.Builder timeline = new Timeline.Builder();
   // Add fallback "no meetings" entry
   // Use the version of TimelineEntry that's in androidx.wear.protolayout.
   timeline.addTimelineEntry(new TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build());
   // Retrieve a list of scheduled meetings
   List<Meeting> meetings = MeetingsRepo.getMeetings();
   // Add a timeline entry for each meeting
   for(Meeting meeting : meetings) {
        timeline.addTimelineEntry(new 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.
                new TimeInterval.builder()
                    .setEndMillis(meeting.getDateTimeMillis()).build()
            ).build()
        );
    }

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

Kart yenileme

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

Süresi dolan verilerle başa çıkmak için blokun ne kadar süre geçerli olacağını belirten bir yenilenme aralığı ayarlayın. Hava durumu kutusu örneğinde, aşağıdaki kod örneğinde gösterildiği gibi içeriğini saatte bir güncelleyebilirsiniz:

Kotlin

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

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTimeline(Timeline.fromLayoutElement(
            getWeatherLayout())
        ).build());
}

Bir yenilenme aralığı ayarladığınızda sistem, aralık sona erdikten kısa bir süre sonra onTileRequest() yöntemini çağırır. Bir yenilenme aralığı ayarlamazsanız sistem, onTileRequest() öğesini çağırmaz.

Harici bir etkinlik nedeniyle de karonun süresi dolabilir. Örneğin, bir kullanıcı bir toplantıyı takvimlerinden kaldırabilir ve kutu yenilenmemişse silinen bu toplantı hâlâ sayfada gösterilir. Bu durumda, aşağıdaki kod örneğinde gösterildiği gibi, uygulama kodunuzun herhangi bir yerinden yenileme isteğinde bulunun:

Kotlin

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

Java

public void eventDeletedCallback() {
   TileService.getUpdater(context)
           .requestUpdate(MyTileService.class);
}

Güncelleme iş akışı seçin

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

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

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

  • Arka planda, hava durumu verileri yoklama gibi daha yoğun çalışmalar yapıyorsanız WorkManager özelliğini kullanın ve güncellemeleri karonuza aktarın.

  • Güncelleme, ışıkların açılması, e-posta alınması veya bir notun güncellenmesi gibi harici bir olaydan kaynaklanıyorsa uygulamanızı tekrar etkin hale getirmek için bir Firebase Cloud Messaging (FCM) mesajı gönderin, ardından güncellemeleri kutuya aktarın.

  • Parça veri senkronizasyon işlemi pahalıysa aşağıdakileri yapın:

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