داده‌های Wear OS را به یک دستگاه تلفن همراه جدید منتقل کنید

وقتی کاربران دستگاه Wear OS را راه‌اندازی می‌کنند ، دستگاه Wear OS را به دستگاه تلفن همراه خاصی متصل می‌کنند. ممکن است کاربر بعداً تصمیم بگیرد که یک دستگاه تلفن همراه جدید تهیه کند و دستگاه Wear OS موجود خود را به این دستگاه تلفن همراه جدید متصل کند. برخی از داده های مربوط به یک دستگاه Wear OS در دستگاه تلفن همراه متصل فعلی ذخیره می شود.

با شروع Wear OS 4، هنگامی که کاربران به یک دستگاه تلفن همراه جدید متصل می شوند، می توانند داده های Wear OS را به دستگاه تلفن همراه جدید منتقل کنند. داده ها هنگام انتقال به طور خودکار همگام سازی می شوند.

هنگامی که کاربر درخواست انتقال می کند، لایه داده پوشیدنی اشیاء DataItem را که در ابتدا در یک دستگاه تلفن همراه ذخیره شده بودند، به دستگاه تلفن همراه دیگر تحویل می دهد. این به کاربران برنامه شما امکان تجربه یکپارچه را می دهد.

این سند توضیح می‌دهد که چگونه می‌توانید برنامه Wear OS خود و برنامه تلفن همراه همراه آن را برای پشتیبانی از این سناریو پیکربندی کنید.

آماده سازی

فرآیند انتقال داده بسته به اینکه کدام برنامه مالک داده است، اشیاء DataItem را به طور متفاوتی مدیریت می کند:

اشیاء متعلق به برنامه Wear OS
این اشیاء در دستگاه Wear OS حفظ می شوند.
اشیاء متعلق به اپلیکیشن موبایل

این اشیاء در دستگاه قدیمی بایگانی می شوند. سپس سیستم داده‌های بایگانی‌شده را در یک شی DataItemBuffer بسته‌بندی می‌کند و این داده‌ها را به برنامه موبایلی که روی دستگاه تلفن همراه جدید نصب شده است، تحویل می‌دهد.

بلافاصله پس از تحویل بایگانی، لایه داده های پوشیدنی شنونده onDataChanged() را فراخوانی می کند، مشابه نحوه اطلاع برنامه شما هنگام نوشتن داده ها توسط دستگاه Wear OS.

داده های منتقل شده را حفظ کنید

این مسئولیت برنامه شماست که اشیاء DataItem منتقل شده را حفظ کند. مدت کوتاهی پس از تحویل داده ها به دستگاه تلفن همراه جدید، بایگانی از دستگاه قدیمی حذف می شود.

مطمئن شوید که هر یک از شرایط زیر درست است:

  1. برنامه شما در هر دو دستگاه تلفن همراهی که در انتقال نقش دارند نصب شده است.
  2. برنامه های تلفن همراه، نصب شده در هر دستگاه تلفن همراه، دارای امضاهای بسته هستند که مطابقت دارند.

در غیر این صورت، اشیاء DataItem بایگانی شده تحویل داده نمی شوند و در عوض دور ریخته می شوند.

داده ها را از دستگاه تلفن همراه قدیمی دریافت کنید

برای دریافت داده‌ها در دستگاه تلفن همراه جدید که در دستگاه تلفن همراه قدیمی بایگانی شده است، برنامه تلفن همراه شما باید پاسخ تماس onNodeMigrated() ، بخشی از کلاس WearableListenerService را اجرا کند. برای این کار مراحل زیر را انجام دهید:

  1. در فایل ساخت برنامه تلفن همراه خود، یک وابستگی به آخرین نسخه کتابخانه پوشیدنی در خدمات Google Play اضافه کنید:

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:18.2.0'
    }
    
  2. WearableListenerService در فایل مانیفست برنامه خود اعلام و صادر کنید:

    <service
    android:name=".MyWearableListenerService"
    android:exported="true">
    <intent-filter>
        ...
        <action android:name="com.google.android.gms.wearable.NODE_MIGRATED" />
        <data android:scheme="wear" />
    </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 suspend 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())
                }
            }
    
            CoroutineScope(Job() + Dispatchers.IO).launch {
                for (dataItem in dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem)
                }
            }
        }
    }
    
    

    جاوا

    
    public class MyWearableListenerService extends WearableListenerService {
        private final DataClient dataClient = Wearable.getDataClient(this);
    
        private boolean shouldHandleDataItem(String nodeId, DataItem dataItem) {
            // Your logic here
            return Objects.requireNonNull(dataItem.getUri().getPath())
                    .startsWith("/my_feature_path/");
        }
    
        private void handleDataItem(String nodeId, DataItem dataItem) {
            byte[] data = dataItem.getData();
            String path = dataItem.getUri().getPath();
            // Your logic here
            if (data != null && path != null && Arrays.toString(data)
                    .startsWith("Please restore")) {
                assert path != null;
                dataClient.putDataItem(
                        PutDataRequest.create(path).setData(data));
            }
        }
    
        @Override
        public void onNodeMigrated(@NonNull String nodeId, DataItemBuffer archive) {
            List<DataItem> dataItemsToHandle = new ArrayList<>();
    
            for (DataItem dataItem : archive) {
                if (shouldHandleDataItem(nodeId, dataItem)) {
                    dataItemsToHandle.add(dataItem.freeze());
                }
            }
    
            Thread thread = new Thread(() -> {
                for (DataItem dataItem : dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem);
                }
            });
            thread.start();
        }
    }
    
    
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}