وقتی کاربران دستگاه 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
منتقل شده را حفظ کند. مدت کوتاهی پس از تحویل داده ها به دستگاه تلفن همراه جدید، بایگانی از دستگاه قدیمی حذف می شود.
مطمئن شوید که هر یک از شرایط زیر درست است:
- برنامه شما در هر دو دستگاه تلفن همراهی که در انتقال نقش دارند نصب شده است.
- برنامه های تلفن همراه، نصب شده در هر دستگاه تلفن همراه، دارای امضاهای بسته هستند که مطابقت دارند.
در غیر این صورت، اشیاء DataItem
بایگانی شده تحویل داده نمی شوند و در عوض دور ریخته می شوند.
داده ها را از دستگاه تلفن همراه قدیمی دریافت کنید
برای دریافت دادهها در دستگاه تلفن همراه جدید که در دستگاه تلفن همراه قدیمی بایگانی شده است، برنامه تلفن همراه شما باید پاسخ تماس onNodeMigrated()
، بخشی از کلاس WearableListenerService
را اجرا کند. برای این کار مراحل زیر را انجام دهید:
در فایل ساخت برنامه تلفن همراه خود، یک وابستگی به آخرین نسخه کتابخانه پوشیدنی در خدمات Google Play اضافه کنید:
dependencies { ... implementation 'com.google.android.gms:play-services-wearable:18.2.0' }
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>
یک کلاس سرویس ایجاد کنید که
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) } } } }
جاوا
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 Task<DataItem> 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; return 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()); } } for (dataItem in dataItemsToHandle) { handleDataItem(nodeId, dataItem); } // Callback stops automatically after 20 seconds of data processing. // If you think you need more time, delegate to another thread. } }
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- یک ماژول Wear OS را ادغام کنید
- صرفه جویی در مصرف برق و باتری