داده‌های 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. در فایل ساخت برنامه موبایل خود، یک وابستگی به آخرین نسخه کتابخانه wearable در سرویس‌های 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)
                }
            }
        }
    }

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}