نقل بيانات Wear OS إلى جهاز جوّال جديد

عندما يضبط المستخدمون جهاز Wear OS، فإنهم يربطون جهاز Wear OS بجهاز جوّال معيّن. وقد يقرّر المستخدم لاحقًا الحصول على جهاز جوّال جديد وربط جهاز Wear OS الحالي بهذا الجهاز الجوّال الجديد. يتم تخزين بعض البيانات المرتبطة بجهاز Wear OS على الجهاز الجوّال المتصل حاليًا.

اعتبارًا من Wear OS 4، عندما يتصل المستخدمون بجهاز جوّال جديد، يمكنهم نقل بيانات Wear OS إلى الجهاز الجوّال الجديد. تتم مزامنة البيانات تلقائيًا عند نقلها.

عندما يطلب المستخدم عملية نقل، تقدّم طبقة البيانات القابلة للارتداء كائنات DataItem التي تم تخزينها في الأصل على جهاز جوّال واحد إلى الجهاز الجوّال الآخر. ويتيح ذلك تجربة سلسة لمستخدمي تطبيقك.

توضّح هذه المقالة كيفية ضبط تطبيق Wear OS وتطبيق الجوّال المصاحب له لدعم هذا السيناريو.

الإعداد

تتعامل عملية نقل البيانات مع كائنات DataItem بشكل مختلف، وذلك حسب التطبيق الذي يملك البيانات:

الكائنات التي يملكها تطبيق Wear OS
يتم الاحتفاظ بهذه الكائنات على جهاز Wear OS.
الكائنات التي يملكها تطبيق الجوّال

يتم أرشفة هذه الكائنات على الجهاز القديم. بعد ذلك، يجمّع النظام البيانات المؤرشفة في كائن DataItemBuffer ويسلّم هذه البيانات إلى تطبيق الجوّال المثبَّت على الجهاز الجوّال الجديد.

مباشرةً بعد تسليم الأرشيف، تستدعي طبقة البيانات القابلة للارتداء أداة الاستماع onNodeMigrated()، على غرار الطريقة التي يتم بها إشعار تطبيقك عند كتابة البيانات بواسطة جهاز Wear OS.

الاحتفاظ بالبيانات المنقولة

يتحمّل تطبيقك مسؤولية الاحتفاظ بكائنات DataItem المنقولة. بعد فترة قصيرة من تسليم البيانات إلى الجهاز الجوّال الجديد، يتم حذف الأرشيف من الجهاز القديم.

تأكَّد من استيفاء كل من الشروط التالية:

  1. تطبيقك مثبَّت على كلا الجهازَين الجوّالَين المشاركَين في عملية النقل.
  2. تتطابق تواقيع حِزم تطبيقات الجوّال المثبَّتة على كل جهاز جوّال.

بخلاف ذلك، لا يتم تسليم كائنات DataItem المؤرشفة ويتم بدلاً من ذلك تجاهلها.

تلقّي البيانات من الجهاز الجوّال القديم

لتلقّي البيانات على الجهاز الجوّال الجديد التي تم أرشفتها على الجهاز الجوّال القديم ، يجب أن ينفّذ تطبيق الجوّال معاودة الاتصال onNodeMigrated()، وهي جزء من فئة WearableListenerService. لإجراء ذلك، اتّبِع الخطوات التالية:

  1. في ملف إصدار تطبيق الجوّال، أضِف تبعية على أحدث إصدار من مكتبة الأجهزة القابلة للارتداء في "خدمات Google Play":

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:19.0.0'
    }
  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)
                }
            }
        }
    }