Создавайте плитки с содержимым, которое меняется с течением времени.
Работа с временными рамками
Временная шкала состоит из одного или нескольких экземпляров 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 секунды.
- Если вы получили обновление из удаленного источника данных до истечения времени, покажите обновленное значение из синхронизации данных. В противном случае покажите кэшированное локальное значение.
Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Минимизируйте эффект регулярных обновлений
- Доступ к местоположению в фоновом режиме
- Начало работы с WorkManager