Синхронизируйте элементы данных с API уровня данных.

DataItem определяет интерфейс, который система использует для синхронизации данных между портативными и носимыми устройствами. Как правило, DataItem состоит из следующих компонентов:

  • Полезная нагрузка: массив байтов, который можно задавать данными, позволяя выполнять собственную сериализацию и десериализацию объектов. Размер полезной нагрузки ограничен 100 КБ.
  • Путь: уникальная строка, которая должна начинаться с косой черты, например, "/path/to/data" .

Примечание: API уровня данных может отправлять сообщения и синхронизировать данные только с телефонами Android или часами Wear OS. Если ваше устройство Wear OS сопряжено с устройством iOS, API уровня данных работать не будет.

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

Обычно DataItem не реализуется напрямую. Вместо этого делается следующее:

  1. Создайте объект PutDataRequest , указав строковый путь для уникальной идентификации элемента.
  2. Вызовите setData() для установки полезной нагрузки.
  3. Если задержка синхронизации негативно повлияет на удобство использования, вызовите setUrgent() .
  4. Используйте метод putDataItem класса DataClient , чтобы запросить у системы создание элемента данных.

При запросе элементов данных система возвращает объекты, корректно реализующие интерфейс DataItem . Однако вместо работы с необработанными байтами с помощью setData() мы рекомендуем использовать карту данных (data map ), которая предоставляет элемент данных с интерфейсом, подобным Bundle .

Для получения более подробной информации см. пример приложения DataLayer .

Синхронизация данных с картой данных

По возможности используйте класс DataMap . Такой подход позволяет работать с элементами данных в виде Android Bundle , благодаря чему система выполняет сериализацию и десериализацию объектов, а вы можете манипулировать данными с помощью пар ключ-значение.

Для использования карты данных:

  1. Создайте объект PutDataMapRequest , указав путь к элементу данных.

    Примечание: Строка пути является уникальным идентификатором элемента данных, позволяющим получить к нему доступ с любой стороны соединения. Путь должен начинаться с косой черты. Если в вашем приложении используются иерархические данные, создайте схему пути, соответствующую структуре данных.

  2. Вызовите метод PutDataMapRequest.getDataMap() , чтобы получить карту данных, в которой можно задавать значения.
  3. Задавайте значения для карты данных, используя методы put...() , например, putString() .
  4. Если задержка синхронизации негативно повлияет на удобство использования, вызовите setUrgent() .
  5. Вызовите метод PutDataMapRequest.asPutDataRequest() , чтобы получить объект PutDataRequest .
  6. Используйте метод putDataItem класса DataClient , чтобы запросить у системы создание элемента данных.

    Примечание: Если телефон и носимые устройства отключены, данные буферизуются и синхронизируются при восстановлении соединения.

В следующем примере метод increaseCounter() демонстрирует, как создать карту данных и поместить в нее данные:

private fun increaseCounter(): Task<DataItem> {
    val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
        dataMap.putInt(COUNT_KEY, count++)
        asPutDataRequest()
    }
    return Wearable.getDataClient(this)
        .putDataItem(putDataReq)
}

Для получения дополнительной информации об обработке Tasks см. справочную документацию .

Внимание: перед использованием API Wearable Data Layer убедитесь, что он доступен на устройстве; в противном случае возникнет исключение. Используйте класс GoogleApiAvailability , реализованный в Horologist .

Установить приоритет элемента данных

API DataClient позволяет отправлять срочные запросы на синхронизацию объектов DataItem . Обычно система задерживает доставку элементов данных в сеть Wear OS для увеличения времени автономной работы пользовательских устройств, но если задержка синхронизации элементов данных негативно влияет на пользовательский опыт, вы можете пометить их как срочные. Например, в приложении для удаленного управления, где пользователь ожидает немедленного отображения своих действий, вы можете настроить систему на немедленную синхронизацию элементов данных, вызвав setUrgent() .

Если вы не вызовете setUrgent() , система может задержать синхронизацию не срочных данных до 30 минут, хотя обычно задержка составляет всего несколько минут. По умолчанию значение срочности — «не срочный», поэтому для сохранения режима немедленной синхронизации, как в предыдущих версиях API Wear OS, необходимо использовать setUrgent() .

Отслеживайте события, связанные с элементами данных.

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

Приведенный ниже фрагмент кода уведомляет приложение об изменении значения счетчика, определенного в предыдущем примере:

override fun onDataChanged(dataEvents: DataEventBuffer) {

    dataEvents.forEach { event ->
        // DataItem changed
        if (event.type == DataEvent.TYPE_CHANGED) {
            event.dataItem.also { item ->
                if (item.uri.path?.compareTo("/count") == 0) {
                    DataMapItem.fromDataItem(item).dataMap.apply {
                        updateCount(getInt(COUNT_KEY))
                    }
                }
            }
        } else if (event.type == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

Эта активность реализует интерфейс DataClient.OnDataChangedListener . Активность добавляет себя в качестве слушателя событий элементов данных в методе onResume() и удаляет слушатель в методе onPause() . Чтобы увидеть реализацию с использованием изображений, моделей представления и сервисов, см. пример приложения DataLayer .

Вы также можете реализовать обработчик событий в виде сервиса. Для получения дополнительной информации см. раздел «Обработчик событий уровня данных» .