DataItem определяет интерфейс, который система использует для синхронизации данных между портативными и носимыми устройствами. Как правило, DataItem состоит из следующих компонентов:
- Полезная нагрузка: массив байтов, который можно задавать данными, позволяя выполнять собственную сериализацию и десериализацию объектов. Размер полезной нагрузки ограничен 100 КБ.
- Путь: уникальная строка, которая должна начинаться с косой черты, например,
"/path/to/data".
Примечание: API уровня данных может отправлять сообщения и синхронизировать данные только с телефонами Android или часами Wear OS. Если ваше устройство Wear OS сопряжено с устройством iOS, API уровня данных работать не будет.
По этой причине не следует использовать API уровня данных в качестве основного способа связи с сетью. Вместо этого следуйте той же схеме, что и в мобильном приложении, с некоторыми незначительными отличиями .
Обычно DataItem не реализуется напрямую. Вместо этого делается следующее:
- Создайте объект
PutDataRequest, указав строковый путь для уникальной идентификации элемента. - Вызовите
setData()для установки полезной нагрузки. - Если задержка синхронизации негативно повлияет на удобство использования, вызовите
setUrgent(). - Используйте метод
putDataItemклассаDataClient, чтобы запросить у системы создание элемента данных.
При запросе элементов данных система возвращает объекты, корректно реализующие интерфейс DataItem . Однако вместо работы с необработанными байтами с помощью setData() мы рекомендуем использовать карту данных (data map ), которая предоставляет элемент данных с интерфейсом, подобным Bundle .
Для получения более подробной информации см. пример приложения DataLayer .
Синхронизация данных с картой данных
По возможности используйте класс DataMap . Такой подход позволяет работать с элементами данных в виде Android Bundle , благодаря чему система выполняет сериализацию и десериализацию объектов, а вы можете манипулировать данными с помощью пар ключ-значение.
Для использования карты данных:
- Создайте объект
PutDataMapRequest, указав путь к элементу данных.Примечание: Строка пути является уникальным идентификатором элемента данных, позволяющим получить к нему доступ с любой стороны соединения. Путь должен начинаться с косой черты. Если в вашем приложении используются иерархические данные, создайте схему пути, соответствующую структуре данных.
- Вызовите метод
PutDataMapRequest.getDataMap(), чтобы получить карту данных, в которой можно задавать значения. - Задавайте значения для карты данных, используя методы
put...(), например,putString(). - Если задержка синхронизации негативно повлияет на удобство использования, вызовите
setUrgent(). - Вызовите метод
PutDataMapRequest.asPutDataRequest(), чтобы получить объектPutDataRequest. - Используйте метод
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 .
Вы также можете реализовать обработчик событий в виде сервиса. Для получения дополнительной информации см. раздел «Обработчик событий уровня данных» .