Przenoszenie danych z Wear OS na nowe urządzenie mobilne
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Gdy użytkownicy konfigurują urządzenie z Wear OS, łączą je z konkretnym urządzeniem mobilnym. Użytkownik może później zdecydować się na zakup nowego urządzenia mobilnego i połączyć z nim dotychczasowe urządzenie z Wear OS. Niektóre dane dotyczące urządzenia Wear OS są przechowywane na aktualnie połączonym urządzeniu mobilnym.
Od wersji Wear OS 4 użytkownicy mogą przenosić dane z Wear OS na nowe urządzenie mobilne po połączeniu z nim. Dane są synchronizowane automatycznie po ich przeniesieniu.
Gdy użytkownik poprosi o przeniesienie, warstwa danych na urządzeniu do noszenia prześle obiekty DataItem, które były pierwotnie przechowywane na jednym urządzeniu mobilnym, na inne urządzenie mobilne. Dzięki temu użytkownicy Twojej aplikacji będą mogli płynnie korzystać z jej funkcji.
Z tego dokumentu dowiesz się, jak skonfigurować aplikację na Wear OS i jej aplikację mobilną, aby obsługiwała ten scenariusz.
Przygotowanie
Proces przenoszenia danych obsługuje obiekty DataItem w różny sposób w zależności od tego, do której aplikacji należą te dane:
Obiekty należące do aplikacji na Wear OS
Te obiekty są przechowywane na urządzeniu z Wear OS.
Obiekty należące do aplikacji mobilnej
Te obiekty są zarchiwizowane na starym urządzeniu. Następnie system pakuje zapisane dane w obiekt DataItemBuffer i przekazuje je do aplikacji mobilnej zainstalowanej na nowym urządzeniu mobilnym.
Bezpośrednio po dostarczeniu archiwu warstwy danych urządzenia noszonego wywołuje się odbiornik onNodeMigrated(), podobnie jak w przypadku powiadomień aplikacji o zapisywaniu danych przez urządzenie z Wear OS.
Zachowanie przeniesionych danych
Twoja aplikacja musi zachować przeniesione obiekty DataItem.
Krótko po przesłaniu danych na nowe urządzenie mobilne archiwum zostanie usunięte ze starego urządzenia.
Upewnij się, że spełnione są te warunki:
Aplikacja jest zainstalowana na obu urządzeniach mobilnych, które biorą udział w przenoszeniu.
Aplikacje mobilne zainstalowane na każdym urządzeniu mobilnym mają odpowiadające sobie podpisy pakietów.
W przeciwnym razie zapisane obiekty DataItem nie są dostarczane, tylko odrzucane.
Odbieranie danych ze starego urządzenia mobilnego
Aby otrzymywać na nowym urządzeniu mobilnym dane zarchiwizowane na starym urządzeniu mobilnym, aplikacja mobilna musi implementować wywołanie zwrotne onNodeMigrated(), które jest częścią klasy WearableListenerService. Aby to zrobić:
W pliku kompilacji aplikacji mobilnej dodaj zależność od najnowszej wersji biblioteki na urządzenia noszące w Usługach Google Play:
Utwórz klasę usługi, która rozszerza klasę WearableListenerService i zastępuje klasę onNodeMigrated().
Kotlin
classMyWearableListenerService:WearableListenerService(){valdataClient:DataClient=Wearable.getDataClient(this)privatefunshouldHandleDataItem(nodeId:String,dataItem:DataItem):Boolean{// Your logic herereturndataItem.uri.path?.startsWith("/my_feature_path/")==true}privatefunhandleDataItem(nodeId:String,dataItem:DataItem){valdata=dataItem.data?:returnvalpath=dataItem.uri.path?:return// Your logic hereif(data.toString().startsWith("Please restore")){dataClient.putDataItem(PutDataRequest.create(path).setData(data))}}overridefunonNodeMigrated(nodeId:String,archive:DataItemBuffer){valdataItemsToHandle=mutableListOf<DataItem>()for(dataIteminarchive){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(dataItemindataItemsToHandle){handleDataItem(nodeId,dataItem)}}}}
Java
publicclassMyWearableListenerServiceextendsWearableListenerService{privatefinalDataClientdataClient=Wearable.getDataClient(this);privatebooleanshouldHandleDataItem(StringnodeId,DataItemdataItem){// Your logic herereturnObjects.requireNonNull(dataItem.getUri().getPath()).startsWith("/my_feature_path/");}privateTask<DataItem>handleDataItem(StringnodeId,DataItemdataItem){byte[]data=dataItem.getData();Stringpath=dataItem.getUri().getPath();// Your logic hereif(data!=null && path!=null && Arrays.toString(data).startsWith("Please restore")){assertpath!=null;returndataClient.putDataItem(PutDataRequest.create(path).setData(data));}@OverridepublicvoidonNodeMigrated(@NonNullStringnodeId,DataItemBufferarchive){List<DataItem>dataItemsToHandle=newArrayList<>();for(DataItemdataItem:archive){if(shouldHandleDataItem(nodeId,dataItem)){dataItemsToHandle.add(dataItem.freeze());}}for(dataItemindataItemsToHandle){handleDataItem(nodeId,dataItem);}// Callback stops automatically after 20 seconds of data processing.// If you think you need more time, delegate to another thread.}}
Polecane dla Ciebie
Uwaga: tekst linku jest wyświetlany, gdy obsługa JavaScript jest wyłączona
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-08-17 UTC.
[null,null,["Ostatnia aktualizacja: 2025-08-17 UTC."],[],[],null,["# Transfer Wear OS data to a new mobile device\n\nWhen users [set up a Wear OS device](https://support.google.com/wearos/answer/6056630), they connect the Wear OS device to a\nparticular mobile device. The user might later decide to get a new mobile device\nand connect their existing Wear OS device to this new mobile device. Some data\nrelated to a Wear OS device is stored on the currently-connected mobile device.\n\nStarting in Wear OS 4, when users connect to a new mobile device, they can\ntransfer Wear OS data to the new mobile device. Data is synced automatically\nwhen it's transferred.\n| **Note:** This process of transferring data to a new mobile device is different from [cloud backup and restore](/training/wearables/data/cloud-backup-restore), where the user restores data to a new Wear OS device.\n\nWhen the user requests a transfer, the [Wearable Data Layer](/training/wearables/data/data-layer) delivers\n[`DataItem`](https://developers.google.com/android/reference/com/google/android/gms/wearable/DataItem) objects, originally stored on one mobile device, to the other\nmobile device. This allows a seamless experience for users of your app.\n\nThis document describes how you can configure your Wear OS app, and its\ncompanion mobile app, to support this scenario.\n\nPreparation\n-----------\n\nThe data transfer process handles `DataItem` objects differently, depending on\nwhich app owns the data:\n\nObjects owned by the Wear OS app\n: These objects are preserved on the Wear OS device.\n\nObjects owned by the mobile app\n\n: These objects are archived on the old device. The system then packages the\n archived data into a [`DataItemBuffer`](https://developers.google.com/android/reference/com/google/android/gms/wearable/DataItemBuffer) object and delivers this data to the\n mobile app that's installed on the new mobile device.\n\n Immediately after the archive is delivered, the Wearable Data Layer invokes\n the [`onNodeMigrated()`](https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService#onNodeMigrated(java.lang.String,%20com.google.android.gms.wearable.DataItemBuffer)) listener, similarly to how your app is notified\n when data is written by the Wear OS device.\n | **Note:** Data is transferred only if it's stored in the Wearable Data Layer.\n\nPreserve transferred data\n-------------------------\n\n| **Warning:** To avoid losing data, follow the guidance in this section.\n\nIt's your app's responsibility to preserve the transferred `DataItem` objects.\nShortly after the data is delivered to the new mobile device, the archive is\ndeleted off of the old device.\n\nMake sure each of the following conditions is true:\n\n1. Your app is installed on both mobile devices that are involved in the transfer.\n2. The mobile apps, installed on each mobile device, have package signatures that match.\n\nOtherwise, the archived `DataItem` objects aren't delivered and are instead\ndiscarded.\n\nReceive data from the old mobile device\n---------------------------------------\n\nTo receive data on the new mobile device that was archived on the old mobile\ndevice, your mobile app must implement the [`onNodeMigrated()`](https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService#onNodeMigrated(java.lang.String,%20com.google.android.gms.wearable.DataItemBuffer)) callback,\npart of the `WearableListenerService` class. To do so, complete the following\nsteps:\n\n1. In your mobile app's build file, include a dependency on the latest version\n of the wearable library in Google Play services:\n\n ```groovy\n dependencies {\n ...\n implementation 'com.google.android.gms:play-services-wearable:19.0.0'\n }\n ```\n2. Declare and export the `WearableListenerService` in your app's\n manifest file:\n\n \u003cservice\n android:name=\".MyWearableListenerService\"\n android:exported=\"true\"\u003e\n \u003cintent-filter\u003e\n ...\n \u003caction android:name=\"com.google.android.gms.wearable.NODE_MIGRATED\" /\u003e\n \u003cdata android:scheme=\"wear\" /\u003e\n \u003c/intent-filter\u003e\n \u003c/service\u003e\n\n3. Create a service class which extends `WearableListenerService` and overrides\n `onNodeMigrated()`.\n\n **Caution:** To preserve system resources such as battery life, and to prevent ANRs, don't execute any power-demanding or time-consuming tasks in the `onNodeMigrated()` handler. \n\n ### Kotlin\n\n ```kotlin\n class MyWearableListenerService : WearableListenerService() {\n val dataClient: DataClient = Wearable.getDataClient(this)\n\n private fun shouldHandleDataItem(nodeId: String,\n dataItem: DataItem): Boolean {\n // Your logic here\n return dataItem.uri.path?.startsWith(\"/my_feature_path/\") == true\n }\n\n private fun handleDataItem(nodeId: String, dataItem: DataItem) {\n val data = dataItem.data ?: return\n val path = dataItem.uri.path ?: return\n // Your logic here\n if (data.toString().startsWith(\"Please restore\")) {\n dataClient.putDataItem(\n PutDataRequest.create(path).setData(data)\n )\n }\n }\n\n override fun onNodeMigrated(nodeId: String, archive: DataItemBuffer) {\n val dataItemsToHandle = mutableListOf\u003cDataItem\u003e()\n\n for (dataItem in archive) {\n if (shouldHandleDataItem(nodeId, dataItem)) {\n dataItemsToHandle.add(dataItem.freeze())\n }\n }\n\n // Callback stops automatically after 20 seconds of data processing.\n // If you think you need more time, delegate to a coroutine or thread.\n runBlocking {\n for (dataItem in dataItemsToHandle) {\n handleDataItem(nodeId, dataItem)\n }\n }\n }\n }\n ```\n\n ### Java\n\n ```java\n public class MyWearableListenerService extends WearableListenerService {\n private final DataClient dataClient = Wearable.getDataClient(this);\n\n private boolean shouldHandleDataItem(String nodeId, DataItem dataItem) {\n // Your logic here\n return Objects.requireNonNull(dataItem.getUri().getPath())\n .startsWith(\"/my_feature_path/\");\n }\n\n private Task\u003cDataItem\u003e handleDataItem(String nodeId, DataItem dataItem) {\n byte[] data = dataItem.getData();\n String path = dataItem.getUri().getPath();\n // Your logic here\n if (data != null && path != null && Arrays.toString(data)\n .startsWith(\"Please restore\")) {\n assert path != null;\n return dataClient.putDataItem(\n PutDataRequest.create(path).setData(data));\n }\n\n @Override\n public void onNodeMigrated(@NonNull String nodeId, DataItemBuffer archive) {\n List\u003cDataItem\u003e dataItemsToHandle = new ArrayList\u003c\u003e();\n\n for (DataItem dataItem : archive) {\n if (shouldHandleDataItem(nodeId, dataItem)) {\n dataItemsToHandle.add(dataItem.freeze());\n }\n }\n\n for (dataItem in dataItemsToHandle) {\n handleDataItem(nodeId, dataItem);\n }\n\n // Callback stops automatically after 20 seconds of data processing.\n // If you think you need more time, delegate to another thread.\n }\n }\n ```\n\nRecommended for you\n-------------------\n\n- Note: link text is displayed when JavaScript is off\n- [Integrate a Wear OS module](/health-and-fitness/guides/basic-fitness-app/integrate-wear-os)\n- [Conserve power and battery](/training/wearables/apps/power)"]]