Перенос данных Wear OS на новое мобильное устройство

When users set up a Wear OS device , they connect the Wear OS device to a particular mobile device. The user might later decide to get a new mobile device and connect their existing Wear OS device to this new mobile device. Some data related to a Wear OS device is stored on the currently-connected mobile device.

Начиная с Wear OS 4, при подключении нового мобильного устройства пользователи могут передавать данные Wear OS на это устройство. Синхронизация данных происходит автоматически при передаче.

When the user requests a transfer, the Wearable Data Layer delivers DataItem objects, originally stored on one mobile device, to the other mobile device. This allows a seamless experience for users of your app.

В этом документе описано, как настроить приложение Wear OS и сопутствующее мобильное приложение для поддержки этого сценария.

Подготовка

В процессе передачи данных объекты DataItem обрабатываются по-разному в зависимости от того, какому приложению принадлежат данные:

Объекты, принадлежащие приложению Wear OS.
Эти объекты сохраняются на устройстве Wear OS.
Объекты, принадлежащие мобильному приложению

These objects are archived on the old device. The system then packages the archived data into a DataItemBuffer object and delivers this data to the mobile app that's installed on the new mobile device.

Сразу после доставки архива слой данных Wearable Data Layer вызывает слушатель onNodeMigrated() , аналогично тому, как ваше приложение получает уведомления о записи данных устройством Wear OS.

Сохранение переданных данных

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

Убедитесь, что каждое из следующих условий выполняется:

  1. Ваше приложение установлено на обоих мобильных устройствах, участвующих в передаче данных.
  2. Мобильные приложения, установленные на каждом мобильном устройстве, имеют совпадающие цифровые подписи пакетов.

В противном случае заархивированные объекты DataItem не доставляются и вместо этого удаляются.

Получение данных со старого мобильного устройства

To receive data on the new mobile device that was archived on the old mobile device, your mobile app must implement the onNodeMigrated() callback, part of the WearableListenerService class. To do so, complete the following steps:

  1. В файле сборки вашего мобильного приложения укажите зависимость от последней версии библиотеки для носимых устройств в сервисах Google Play:

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:20.0.1'
    }
    
  2. Объявите и экспортируйте WearableListenerService в файле манифеста вашего приложения:

    <service
        android:name=".snippets.datalayer.MyWearableListenerService"
        android:exported="true"
        tools:ignore="ExportedService">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.NODE_MIGRATED" />
            <data android:scheme="wear" android:host="*" />
        </intent-filter>
    </service>

  3. Создайте класс сервиса, который наследует WearableListenerService и переопределяет onNodeMigrated() .

    class MyWearableListenerService : WearableListenerService() {
        val dataClient: DataClient = Wearable.getDataClient(this)
    
        private fun shouldHandleDataItem(nodeId: String, dataItem: DataItem): Boolean {
            // Your logic here
            return dataItem.uri.path?.startsWith("/my_feature_path/") == true
        }
    
        private fun handleDataItem(nodeId: String, dataItem: DataItem) {
            val data = dataItem.data ?: return
            val path = dataItem.uri.path ?: return
            // Your logic here
            if (data.toString().startsWith("Please restore")) {
                dataClient.putDataItem(PutDataRequest.create(path).setData(data))
            }
        }
    
        override fun onNodeMigrated(nodeId: String, archive: DataItemBuffer) {
            val dataItemsToHandle = mutableListOf<DataItem>()
    
            for (dataItem in archive) {
                if (shouldHandleDataItem(nodeId, dataItem)) {
                    dataItemsToHandle.add(dataItem.freeze())
                }
            }
    
            // Callback stops automatically after 20 seconds of data processing.
            // If you think you need more time, delegate to a coroutine or thread.
            runBlocking {
                for (dataItem in dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem)
                }
            }
        }
    }

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}