Karolarda düzenli güncellemeleri göster

Zaman geçtikçe değişen içeriğe sahip karolar 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 kutucukların zaman çizelgesi olmalıdır.

Karo zaman çizelgesi diyagramı

Tek girişli karolar

Bir karo genellikle tek bir TimelineEntry ile açıklanabilir. Düzen sabittir ve yalnızca düzenin içindeki bilgiler değişir. Örneğin, fitness durumunuzu gösteren bir karoda her zaman aynı ilerleme düzeni gösterilir. Ancak, bu düzeni farklı değerler gösterecek şekilde ayarlayabilirsiniz. Bu gibi durumlarda, içeriğin ne zaman değişebileceğini önceden bilemezsiniz.

Aşağıdaki tek bir TimelineEntry içeren blok örneğini inceleyin:

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 bir geçerlilik süresi tanımlayabilir. Bu sayede, uygulamanın yeni bir Kart aktarmasına gerek kalmadan karonun düzenini bilinen bir zamanda değiştirebilir.

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

Karolar API'si çakışan geçerlilik sürelerine izin verir. Burada, kalan en kısa süreli ekran gösterilen süredir. Aynı anda yalnızca bir etkinlik görüntülenir.

Geliştiriciler, varsayılan bir yedek giriş sağlayabilir. Örneğin, ajanda blokunda, aşağıdaki kod örneğinde gösterildiği gibi başka bir zaman çizelgesi girişi geçerli değilse bu öğe kullanılır ve sonsuz geçerlilik süresine sahip bir karo bulunabilir:

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

Karolarda 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 karonun oluşturulduğu anda karonun ne kadar süre geçerli olduğunu 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 yenileme aralığı belirlediğinizde, sistem aralık sona erdikten kısa bir süre sonra onTileRequest() aracını çağırır. Yenileme aralığı ayarlamazsanız sistem onTileRequest() değerini çağırmaz.

Harici bir etkinlik nedeniyle de karonun süresi dolabilir. Örneğin, bir kullanıcı bir toplantıyı takviminden kaldırabilir ve kutu yenilenmediyse karoda yine de silinen toplantı görünür. 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

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

  • Güncelleme tahmin edilebilirse (örneğin, kullanıcının takvimindeki bir sonraki etkinlikle ilgiliyse) bir 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 hesaplayabiliyorsa (ör. gün doğumu karosundaki bir resmin konumunu güncellemek) onTileRequest() özelliğini kullanın.

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

  • Arka planda tekrar tekrar daha yoğun çalışmalar (ör. hava durumu verileri için anket yapma) yapıyorsanız WorkManager özelliğini kullanın ve güncellemeleri karonunuza aktarın.

  • Güncelleme, ışıkların açılması, e-posta alınması veya bir not güncellenmesi gibi harici bir etkinlik nedeniyle yapılmışsa uygulamanızı tekrar etkin hale getirmek için bir Firebase Cloud Messaging (FCM) mesajı gönderin, ardından güncellemeleri karoya aktarın.

  • Parça veri senkronizasyonu 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 güncellenen değeri gösterin. Aksi takdirde, önbelleğe alınmış bir yerel değer gösterin.