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

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

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

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

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

‫DataClient میانای برنامه‌سازی کاربردی‌ای را برای مؤلفه‌ها آشکار می‌کند تا در DataItem یا Asset بخوانند یا بنویسند.

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

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

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

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

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

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

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

description: Transfer large binary objects, such as images, between Android phones and Wear OS watches using Assets in the Data Layer API. keywords_public: Wear OS, Data Layer API, Assets, Bluetooth data transfer, data synchronization, DataMap, PutDataRequest

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

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

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

به همین دلیل، از Data Layer 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() در مخزن داده قرار دهید، همان‌طور که در نمونه‌های زیر نشان داده شده است.

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