Data Layer API-এর মাধ্যমে ডেটা আইটেম সিঙ্ক করা

DataItem হ্যান্ডহেল্ড ও ওয়্যারেবল ডিভাইসের মধ্যে ডেটা সিঙ্ক করার জন্য সিস্টেম যে ইন্টারফেস ব্যবহার করে তা নির্ধারণ করে। DataItem-এ সাধারণত নিম্নলিখিত কম্পোনেন্ট থাকে:

  • পে-লোড: একটি বাইট অ্যারে যা আপনি ডেটা দিয়ে সেট করতে পারেন, এর ফলে আপনি নিজের অবজেক্ট সিরিয়ালাইজেশন ও ডিসিয়ারিয়ালাইজেশন করতে পারবেন। পে-লোডের সাইজ ১০০ কেবির মধ্যে সীমাবদ্ধ।
  • পাথ: একটি অনন্য স্ট্রিং যা অবশ্যই একটি ফরওয়ার্ড স্ল্যাশ দিয়ে শুরু হতে হবে, যেমন "/path/to/data"।

মনে রাখবেন: Data Layer API শুধুমাত্র Android ফোন বা Wear OS ওয়াচের সাথে মেসেজ পাঠাতে ও ডেটা সিঙ্ক করতে পারে। আপনার Wear OS ডিভাইস কোনও iOS ডিভাইসের সাথে পেয়ার করা থাকলে, Data Layer API কাজ করবে না।

এই কারণে, নেটওয়ার্কের সাথে যোগাযোগ করার প্রাথমিক উপায় হিসেবে Data Layer API ব্যবহার করবেন না। পরিবর্তে, মোবাইল অ্যাপের মতো একই প্যাটার্ন ফলো করুন, তবে কিছু সামান্য পার্থক্য থাকবে।

আপনি সাধারণত DataItem সরাসরি প্রয়োগ করেন না। এর পরিবর্তে, আপনি নিম্নলিখিত কাজগুলি করুন:

  1. PutDataRequest অবজেক্ট তৈরি করুন, আইটেমকে অনন্যভাবে শনাক্ত করতে একটি স্ট্রিং পাথ নির্দিষ্ট করুন।
  2. পে-লোড সেট করতে setData()-এ কল করুন।
  3. সিঙ্ক করার ক্ষেত্রে দেরি হলে ব্যবহারকারীর অভিজ্ঞতার উপর খারাপ প্রভাব পড়লে, কল করুন setUrgent()।
  4. সিস্টেমকে ডেটা আইটেম তৈরি করার অনুরোধ জানাতে, DataClient ক্লাসের putDataItem পদ্ধতি ব্যবহার করুন।

ডেটা আইটেমের অনুরোধ করলে, সিস্টেম এমন অবজেক্ট রিটার্ন করে যা সঠিকভাবে DataItem ইন্টারফেস প্রয়োগ করে। তবে, কাঁচা বাইট নিয়ে কাজ করার পরিবর্তে setData(), আমরা সাজেস্ট করি যে আপনি ডেটা ম্যাপ ব্যবহার করুন, যা Bundle-এর মতো ইন্টারফেসের সাথে ডেটা আইটেম প্রকাশ করে।

আরও তথ্যের জন্য, DataLayer Sample অ্যাপ দেখুন।

ডেটা ম্যাপের সাথে ডেটা সিঙ্ক করা

সম্ভব হলে, DataMap ক্লাস ব্যবহার করুন। এই পদ্ধতিতে আপনি Android Bundle-এর মতো ডেটা আইটেম নিয়ে কাজ করতে পারেন, তাই সিস্টেম আপনার জন্য অবজেক্ট সিরিয়ালাইজেশন ও ডিসিরিয়ালাইজেশন করে এবং আপনি কী-ভ্যালু পেয়ারের মাধ্যমে ডেটা ম্যানিপুলেট করতে পারেন।

ডেটা ম্যাপ ব্যবহার করতে:

  1. ডেটা আইটেমের পাথ সেট করে, একটি PutDataMapRequest অবজেক্ট তৈরি করুন।

    মনে রাখবেন: পাথ স্ট্রিং হল ডেটা আইটেমের অনন্য শনাক্তকারী যা আপনাকে কানেকশনের যেকোনও দিক থেকে এটি অ্যাক্সেস করতে দেয়। পাথটি অবশ্যই একটি ফরওয়ার্ড স্ল্যাশ দিয়ে শুরু হতে হবে। আপনার অ্যাপে হায়রার্কিক্যাল ডেটা ব্যবহার করলে, ডেটার স্ট্রাকচারের সাথে ম্যাচ করে এমন পাথ স্কিম তৈরি করুন।

  2. আপনি ভ্যালু সেট করতে পারেন এমন ডেটা ম্যাপ পেতে PutDataMapRequest.getDataMap()-এ কল করুন।
  3. put...() পদ্ধতি ব্যবহার করে ডেটা ম্যাপের জন্য ভ্যালু সেট করুন, যেমন putString().
  4. সিঙ্ক করার ক্ষেত্রে দেরি হলে ব্যবহারকারীর অভিজ্ঞতার উপর খারাপ প্রভাব পড়লে, কল করুন setUrgent()।
  5. PutDataMapRequest.asPutDataRequest()-এ কল করে একটি PutDataRequest অবজেক্ট পান।
  6. সিস্টেমকে ডেটা আইটেম তৈরি করার অনুরোধ জানাতে, putDataItem পদ্ধতির DataClient ক্লাস ব্যবহার করুন।

    মনে রাখবেন: হ্যান্ডসেট ও পরিধানযোগ্য ডিভাইস ডিসকানেক্ট হয়ে গেলে, কানেকশন আবার চালু হলে ডেটা বাফার করা হয় ও সিঙ্ক করা হয়।

নিচের উদাহরণে increaseCounter() পদ্ধতিটি দেখায় যে কীভাবে ডেটা ম্যাপ তৈরি করতে হয় এবং তাতে ডেটা যোগ করতে হয়:

private fun increaseCounter(): Task<DataItem> {
    val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
        dataMap.putInt(COUNT_KEY, count++)
        asPutDataRequest()
    }
    return Wearable.getDataClient(this)
        .putDataItem(putDataReq)
}

Tasks হ্যান্ডেল করা সম্পর্কে আরও জানতে, রেফারেন্স ডকুমেন্টেশন দেখুন।

সতর্কতা: Wearable Data Layer API ব্যবহার করার আগে, এটি কোনও ডিভাইসে উপলভ্য আছে কিনা তা চেক করে নিন; তা না হলে, ব্যতিক্রম ঘটবে। Horologist-এ যেভাবে প্রয়োগ করা হয়েছে, সেইভাবে GoogleApiAvailability class ব্যবহার করুন।

DataItem-এর অগ্রাধিকার সেট করা

DataClient API, DataItem অবজেক্ট সিঙ্ক করার জন্য জরুরি অনুরোধ করার অনুমতি দেয়। সাধারণত, ব্যবহারকারীর ডিভাইসের ব্যাটারির আয়ু উন্নত করতে, Wear OS নেটওয়ার্কে ডেটা আইটেম ডেলিভারি করতে সিস্টেম দেরি করে, কিন্তু ডেটা আইটেম সিঙ্ক করতে দেরি হলে ব্যবহারকারীর অভিজ্ঞতার উপর নেতিবাচক প্রভাব পড়লে, আপনি সেগুলিকে 'জরুরি' হিসেবে চিহ্নিত করতে পারেন। যেমন, রিমোট কন্ট্রোল অ্যাপে ব্যবহারকারী যখন আশা করেন যে তার অ্যাকশন সাথে সাথেই প্রতিফলিত হবে, তখন আপনি setUrgent() কল করে সিস্টেমকে আপনার ডেটা আইটেম সাথে সাথেই সিঙ্ক করতে বলতে পারেন।

আপনি setUrgent()-এ কল না করলে, জরুরি নয় এমন ডেটা আইটেম সিঙ্ক করার আগে সিস্টেম ৩০ মিনিট পর্যন্ত দেরি করতে পারে, যদিও আপনি সাধারণত আশা করতে পারেন যে দেরি শুধুমাত্র কয়েক মিনিট হবে। ডিফল্ট হিসেবে জরুরি নয় হিসেবে চিহ্নিত করা হয়, তাই Wear OS API-এর আগের ভার্সন থেকে অবিলম্বে সিঙ্ক করার আচরণ বজায় রাখতে চাইলে আপনাকে অবশ্যই setUrgent() ব্যবহার করতে হবে।

ডেটা আইটেম ইভেন্ট শোনা

ডেটা লেয়ার কানেকশনের একদিকের ডেটা আইটেম পরিবর্তন হলে, কানেকশনের অপরদিকের ব্যবহারকারীকে সেই পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পাঠাও। ডেটা আইটেম ইভেন্টের জন্য লিসনার প্রয়োগ করে আপনি এটি করতে পারবেন।

নিচের উদাহরণে দেওয়া কোড স্নিপেট, আগের উদাহরণে দেওয়া কাউন্টারের ভ্যালু পরিবর্তন হলে অ্যাপকে বিজ্ঞপ্তি পাঠায়:

override fun onDataChanged(dataEvents: DataEventBuffer) {

    dataEvents.forEach { event ->
        // DataItem changed
        if (event.type == DataEvent.TYPE_CHANGED) {
            event.dataItem.also { item ->
                if (item.uri.path?.compareTo("/count") == 0) {
                    DataMapItem.fromDataItem(item).dataMap.apply {
                        updateCount(getInt(COUNT_KEY))
                    }
                }
            }
        } else if (event.type == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

এই অ্যাক্টিভিটি DataClient.OnDataChangedListener ইন্টারফেস প্রয়োগ করে। onResume() পদ্ধতির মধ্যে ডেটা আইটেম ইভেন্টের জন্য অ্যাক্টিভিটি নিজেকে লিসনার হিসেবে যোগ করে এবং onPause() পদ্ধতিতে লিসনারকে সরিয়ে দেয়। ছবি, মডেল ও পরিষেবা ব্যবহার করে কোনও প্রয়োগ দেখতে, DataLayer Sample অ্যাপ দেখুন।

এছাড়াও, আপনি কোনও পরিষেবা হিসেবে লিসনার প্রয়োগ করতে পারেন। আরও তথ্যের জন্য, ডেটা লেয়ার ইভেন্টের জন্য শোনা দেখুন।