همگام‌سازی داده‌ها

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

ارسال و همگام‌سازی داده‌ها مستقیماً از شبکه

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

همگام‌سازی داده‌ها بااستفاده از Wear OS Data Layer API

DataClient میانای برنامه‌سازی کاربردی را برای عناصر آشکار می‌کند تا در DataItem یا Asset بخوانند یا بنویسند.

می‌توانید عناصر داده و دارایی‌ها را درحالی‌که به هیچ دستگاهی متصل نیستید تنظیم کنید. وقتی دستگاه‌ها اتصال شبکه برقرار می‌کنند، همگام‌سازی می‌شوند. این داده‌ها برای برنامه شما خصوصی است و فقط برنامه شما در دستگاه‌های دیگر می‌تواند به آن دسترسی داشته باشد.

  • DataItem در همه دستگاه‌های شبکه Wear OS همگام‌سازی می‌شود. آن‌ها معمولاً کوچک هستند.

  • از Asset برای انتقال شیء بزرگ‌تری مثل تصویر استفاده کنید. سیستم دارایی‌هایی را که قبلاً منتقل شده‌اند پیگیری می‌کند و حذف تکراری‌ها را به‌طور خودکار انجام می‌دهد.

گوش دادن به رویدادها در سرویس‌ها

کلاس WearableListenerService را تمدید کنید. سیستم چرخه حیات WearableListenerService پایه را مدیریت می‌کند، وقتی نیاز به ارسال پیام یا داده دارد به سرویس متصل می‌شود و وقتی نیازی به کار نیست سرویس را قطع می‌کند.

گوش دادن به رویدادها در فعالیت‌ها

میانای OnDataChangedListener را پیاده‌سازی کنید. وقتی می‌خواهید فقط زمانی به تغییرات گوش دهید که کاربر فعالانه از برنامه‌تان استفاده می‌کند، به‌جای WearableListenerService از این میانای کاربری استفاده کنید.

description: انتقال اشیای باینری بزرگ، مانند تصاویر، بین تلفن‌های Android و ساعت‌های Wear OS بااستفاده از «دارایی‌ها» در Data Layer API. keywords_public: Wear OS،‏ Data Layer API،‏ «دارایی‌ها»، انتقال داده Bluetooth، همگام‌سازی داده‌ها، DataMap،‏ PutDataRequest

همگام‌سازی داده‌ها

برای هم‌رسانی کردن اشیای باینری بزرگ ازطریق انتقال بلوتوث، مثل صدای ضبط‌شده از دستگاه دیگر، می‌توانید Asset را به عنصر داده‌ای پیوست کنید و سپس عنصر داده را در مخزن داده تکثیرشده قرار دهید.

توجه: «میانای برنامه‌سازی کاربردی لایه داده» فقط می‌تواند با تلفن‌های دارای Android یا ساعت‌های Wear OS پیام ارسال کند و داده‌ها را همگام‌سازی کند. اگر دستگاه Wear OS با دستگاه iOS جفت شده باشد، «میانای برنامه‌سازی کاربردی لایه داده» کار نخواهد کرد.

به همین دلیل، از «میانای برنامه‌سازی کاربردی لایه داده» به‌عنوان روش اصلی ارتباط با شبکه استفاده نکنید. به‌جای آن، همان الگوی برنامه تلفن را در برنامه Wear OS خود دنبال کنید—با چند تفاوت جزئی، همان‌طور که در دسترسی به شبکه و همگام‌سازی در Wear OS توضیح داده شده است.

دارایی‌ها به‌طور خودکار مدیریت ذخیره داده‌ها در حافظه نهان را انجام می‌دهند تا از ارسال مجدد جلوگیری کنند و پهنای باند بلوتوث را حفظ کنند. الگوی رایج این است که برنامه تلفن تصویری را بارگیری کند، آن را به اندازه مناسب برای نمایش در ساعت کوچک کند، و آن را به‌عنوان دارایی با برنامه ساعت هم‌رسانی کند. مثال‌های زیر این الگو را نشان می‌دهند.

انتقال دارایی

دارایی را بااستفاده از یکی از create...() روش در کلاس Asset ایجاد کنید. یک بیت‌مپ را به آرایه بایت تبدیل کنید و سپس برای ایجاد دارایی، همان‌طور که در نمونه زیر نشان داده شده است، createFromBytes() را فراخوانی کنید.

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

سپس دارایی را با روش putAsset() در DataMap یا PutDataRequest به عنصر داده پیوست کنید. سپس عنصر داده را بااستفاده از روش putDataItem() در انبار داده قرار دهید، همان‌طور که در نمونه‌های زیر نشان داده شده است.

نمونه زیر از PutDataRequest استفاده می‌کند:

private fun Context.sendImagePutDataRequest(): Task<DataItem> {

    val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk))
    val request: PutDataRequest = PutDataRequest.create("/image").apply {
        putAsset("profileImage", asset)
    }
    val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request)

    return putTask
}

نمونه زیر از PutDataMapRequest استفاده می‌کند:

private fun Context.sendImagePutDataMapRequest(): Task<DataItem> {

    val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk))
    val request: PutDataRequest = PutDataMapRequest.create("/image").run {
        dataMap.putAsset("profileImage", asset)
        asPutDataRequest()
    }
    val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request)

    return putTask
}

دریافت دارایی‌ها

پس‌از ایجاد دارایی، معمولاً آن را در طرف دیگر اتصال می‌خوانید و استخراج می‌کنید. مثال زیر نحوه پیاده‌سازی کردن بازخوان برای تشخیص تغییر دارایی و استخراج دارایی را نشان می‌دهد:

override fun onDataChanged(dataEvents: DataEventBuffer) {
    dataEvents
        .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" }
        .forEach { event ->
            val asset = DataMapItem.fromDataItem(event.dataItem)
                .dataMap.getAsset("profileImage")

            asset?.let { safeAsset ->
                lifecycleScope.launch {
                    val bitmap = loadBitmapFromAsset(safeAsset)
                    // Do something with the bitmap
                }
            }
        }
}

private suspend fun loadBitmapFromAsset(asset: Asset): Bitmap? = withContext(Dispatchers.IO) {
    try {
        val assetResult = Wearable.getDataClient(this@DataLayerActivity2)
            .getFdForAsset(asset)
            .await()

        assetResult?.inputStream?.use { inputStream ->
            BitmapFactory.decodeStream(inputStream)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

برای اطلاعات بیشتر، پروژه نمونه DataLayer را در GitHub ببینید.