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

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

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

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

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

یک DataClient یک API را در اختیار کامپوننت‌ها قرار می‌دهد تا یک DataItem یا Asset را بخوانند یا بنویسند.

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

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

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

به رویدادها در خدمات گوش دهید

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

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

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

شرح: انتقال اشیاء باینری بزرگ، مانند تصاویر، بین تلفن‌های اندروید و ساعت‌های Wear OS با استفاده از Assets در API لایه داده. keywords_public: Wear OS، API لایه داده، Assets، انتقال داده بلوتوث، همگام‌سازی داده‌ها، DataMap، PutDataRequest

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

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

توجه: رابط برنامه‌نویسی کاربردی لایه داده (Data Layer API) فقط می‌تواند با گوشی‌هایی که اندروید یا ساعت‌های هوشمند Wear OS را اجرا می‌کنند، پیام ارسال کند و داده‌ها را همگام‌سازی کند. اگر یک دستگاه Wear OS با یک دستگاه iOS جفت شود، رابط برنامه‌نویسی کاربردی لایه داده (Data Layer API) کار نخواهد کرد.

به همین دلیل، از API لایه داده به عنوان روش اصلی برای ارتباط با شبکه استفاده نکنید. در عوض، در برنامه 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() در datastore قرار دهید، همانطور که در نمونه‌های زیر نشان داده شده است.

نمونه زیر از 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 مراجعه کنید.