تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
عندما يُعدّ المستخدمون جهاز Wear OS، يربطون جهاز Wear OS بأحد
الأجهزة الجوّالة المحدّدة. قد يقرر المستخدم لاحقًا الحصول على جهاز جوّال جديد
وربط جهاز Wear OS الحالي بهذا الجهاز الجوّال الجديد. يتم تخزين بعض البيانات
المرتبطة بجهاز Wear OS على الجهاز الجوّال المتصل حاليًا.
بدءًا من Wear OS 4، يمكن للمستخدمين عند الاتصال بجهاز جوّال جديد
نقل بيانات Wear OS إلى الجهاز الجوّال الجديد. تتم مزامنة البيانات تلقائيًا عند نقلها.
عندما يطلب المستخدم إجراء عملية نقل، تُرسِل Wearable Data Layer عناصر
DataItem، التي كانت مخزّنة في الأصل على أحد الأجهزة الجوّالة، إلى
الجهاز الجوّال الآخر. يتيح ذلك تجربة سلسة لمستخدمي تطبيقك.
يوضّح هذا المستند كيفية ضبط تطبيق Wear OS وتطبيقه المصاحب المتوافق مع الأجهزة الجوّالة ليتيح هذا السيناريو.
الإعداد
تتعامل عملية نقل البيانات مع عناصر DataItem بشكلٍ مختلف، استنادًا إلى
التطبيق الذي يملك البيانات:
العناصر التي يملكها تطبيق Wear OS
يتم الاحتفاظ بهذه العناصر على جهاز Wear OS.
العناصر التي يملكها التطبيق المتوافق مع الأجهزة الجوّالة
يتم أرشفة هذه العناصر على الجهاز القديم. بعد ذلك، يُجمِّع النظام
البيانات المؤرشفة في عنصر DataItemBuffer ويرسل هذه البيانات إلى
التطبيق المتوافق مع الأجهزة الجوّالة المثبَّت على الجهاز الجوّال الجديد.
بعد تسليم الأرشيف مباشرةً، تستدعي Wearable Data Layer
مستمع onNodeMigrated()، تمامًا مثل الطريقة التي يتم بها إرسال إشعار إلى تطبيقك
عند كتابة البيانات بواسطة جهاز Wear OS.
الاحتفاظ بالبيانات المنقولة
تقع على عاتق تطبيقك مسؤولية الحفاظ على عناصر DataItem التي تم نقلها.
بعد وقت قصير من تسليم البيانات إلى الجهاز الجوّال الجديد، تتم إزالة الأرشيف من الجهاز القديم.
تأكَّد من توفُّر كلّ شرط من الشروط التالية:
تم تثبيت تطبيقك على كلا الجهازَين الجوّالَين المعنيّين في عملية التحميل/التنزيل.
تتضمّن التطبيقات المتوافقة مع الأجهزة الجوّالة المثبَّتة على كل جهاز جوّال توقيعات
حِزم متطابقة.
بخلاف ذلك، لا يتم تسليم عناصر DataItem المؤرشفة ويتم بدلاً من ذلك
التخلص منها.
تلقّي البيانات من الجهاز الجوّال القديم
لتلقّي البيانات على الجهاز الجوّال الجديد التي تم أرشفتها على الجهاز
الجوال القديم، يجب أن ينفذ تطبيقك الجوّال طلب إعادة الاتصال onNodeMigrated()، وهو جزء من فئة WearableListenerService. لإجراء ذلك، يُرجى إكمال الخطوات التالية:
في ملف إنشاء تطبيقك المتوافق مع الأجهزة الجوّالة، أدرِج تبعية لأحدث إصدار
من مكتبة الأجهزة القابلة للارتداء في "خدمات Google Play":
أنشئ فئة خدمة تمتد إلى WearableListenerService وتلغي
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.}}
أفلام مُقترَحة لك
ملاحظة: يتم عرض نص الرابط عندما تكون لغة JavaScript غير مفعّلة.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-08-30 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-08-30 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["When 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\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 **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\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- 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)"]]