Показывать периодические обновления на плитках

Создавайте плитки с содержимым, которое меняется с течением времени.

Работа с временными рамками

Временная шкала состоит из одного или нескольких экземпляров TimelineEntry , каждый из которых содержит макет, отображаемый в течение определенного временного интервала. Всем плиткам нужна временная шкала.

Диаграмма временной шкалы плитки

Плитка с одним входом

Часто плитку можно описать одним TimelineEntry . Макет фиксирован, и меняется только информация внутри макета. Например, плитка, которая показывает ваш прогресс в фитнесе за день, всегда показывает один и тот же макет прогресса, хотя вы можете настроить этот макет, чтобы показывать другие значения. В этих случаях вы не знаете заранее, когда может измениться содержимое.

См. следующий пример плитки с одним TimelineEntry :

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)
}

Записи временной шкалы

TimelineEntry может опционально определять период действия, позволяя плитке менять свой макет в известное время, не требуя от приложения отправки новой плитки.

Канонический пример — плитка повестки дня, временная шкала которой содержит список предстоящих событий. Каждое предстоящее событие содержит период действия, указывающий, когда его показывать.

API плиток допускает перекрывающиеся периоды действия, где отображается экран с наименьшим оставшимся периодом времени. Одновременно отображается только одно событие.

Разработчики могут предоставить запись-откат по умолчанию. Например, плитка повестки дня может иметь плитку с бесконечным сроком действия, которая используется, если никакая другая запись временной шкалы не является допустимой, как показано в следующем примере кода:

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)
}

Обновить плитку

Информация, отображаемая на плитке, может устареть через некоторое время. Например, плитка погоды, которая показывает одну и ту же температуру в течение дня, не является точной.

Чтобы справиться с устаревшими данными, установите интервал свежести во время создания плитки, который определяет, как долго плитка действительна. В примере с плиткой погоды вы можете обновлять ее содержимое каждый час, как показано в следующем примере кода:

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()
    )

Когда вы устанавливаете интервал свежести, система вызывает onTileRequest() вскоре после окончания интервала. Если вы не устанавливаете интервал свежести, система не вызывает onTileRequest() .

Плитка также может устареть из-за внешнего события. Например, пользователь может удалить встречу из своего календаря, и если плитка не была обновлена, то она все равно будет отображать удаленную встречу. В этом случае запросите обновление из любого места в коде вашего приложения, как показано в следующем примере кода:

Котлин

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

Ява

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

Выберите рабочий процесс обновления

Используйте эти рекомендации, чтобы определить, как настроить обновления плиток:

  • Если обновление предсказуемо (например, если оно касается следующего события в календаре пользователя), используйте временную шкалу.
  • При получении данных платформы используйте привязку данных, чтобы система автоматически обновляла данные.
  • Если обновление можно рассчитать на устройстве за небольшой промежуток времени, например, обновить положение изображения на тайле восхода солнца, используйте onTileRequest() .

    Это особенно полезно, когда вам нужно сгенерировать все изображения заранее. Если вам нужно сгенерировать новое изображение в будущем, вызовите setFreshnessIntervalMillis() .

  • Если вы часто выполняете более интенсивную фоновую работу, например, опрашиваете данные о погоде, используйте WorkManager и отправляйте обновления на свою плитку.

  • Если обновление вызвано внешним событием, например включением света, получением электронного письма или обновлением заметки, отправьте сообщение Firebase Cloud Messaging (FCM), чтобы снова активировать приложение, а затем отправьте обновления на плитку.

  • Если процесс синхронизации данных плитки может оказаться дорогостоящим, выполните следующие действия:

    1. Запланируйте синхронизацию данных.
    2. Запустите таймер на 1–2 секунды.
    3. Если вы получили обновление из удаленного источника данных до истечения времени, покажите обновленное значение из синхронизации данных. В противном случае покажите кэшированное локальное значение.
{% дословно %} {% endverbatim %} {% дословно %} {% endverbatim %}