انتقال داده‌های 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: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)
                }
            }
        }
    }