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