ডেটা লেয়ার API এর সাথে ডেটা আইটেম সিঙ্ক করুন

একটি DataItem ইন্টারফেসকে সংজ্ঞায়িত করে যা সিস্টেম হ্যান্ডহেল্ড এবং পরিধানযোগ্যগুলির মধ্যে ডেটা সিঙ্ক্রোনাইজ করতে ব্যবহার করে। একটি DataItem সাধারণত নিম্নলিখিত উপাদান নিয়ে গঠিত:

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

দ্রষ্টব্য: ডেটা লেয়ার API শুধুমাত্র Android ফোন বা Wear OS ঘড়ির সাথে বার্তা পাঠাতে এবং ডেটা সিঙ্ক্রোনাইজ করতে পারে। আপনার Wear OS ডিভাইসটি iOS ডিভাইসের সাথে যুক্ত থাকলে, ডেটা লেয়ার API কাজ করবে না।

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

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

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

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

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

একটি ডেটা মানচিত্রের সাথে ডেটা সিঙ্ক করুন

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

একটি ডেটা মানচিত্র ব্যবহার করতে:

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

    দ্রষ্টব্য: পাথ স্ট্রিংটি ডেটা আইটেমের জন্য একটি অনন্য শনাক্তকারী যা আপনাকে সংযোগের উভয় দিক থেকে এটি অ্যাক্সেস করতে দেয়। পথটি একটি ফরোয়ার্ড স্ল্যাশ দিয়ে শুরু করতে হবে। আপনি যদি আপনার অ্যাপে শ্রেণীবদ্ধ ডেটা ব্যবহার করেন, তাহলে একটি পাথ স্কিম তৈরি করুন যা ডেটার কাঠামোর সাথে মেলে।

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

    দ্রষ্টব্য: হ্যান্ডসেট এবং পরিধানযোগ্য ডিভাইসগুলি সংযোগ বিচ্ছিন্ন হলে, সংযোগটি পুনঃস্থাপিত হলে ডেটা বাফার এবং সিঙ্ক করা হয়৷

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

কোটলিন

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity() {

    private lateinit var dataClient: DataClient
    private var count = 0
    ...
    // Create a data map and put data in it
    private fun increaseCounter() {
        val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
            dataMap.putInt(COUNT_KEY, count++)
            asPutDataRequest()
        }
        val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)
    }
    ...
}

জাভা

public class MainActivity extends Activity {
    private static final String COUNT_KEY = "com.example.key.count";
    private DataClient dataClient;
    private int count = 0;
    ...
    // Create a data map and put data in it
    private void increaseCounter() {
        PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
        putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
        PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
        Task<DataItem> putDataTask = dataClient.putDataItem(putDataReq);
    }
  ...
}

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

ডেটা আইটেম অগ্রাধিকার সেট করুন

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

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

ডেটা আইটেম ইভেন্টের জন্য শুনুন

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

পূর্ববর্তী উদাহরণে সংজ্ঞায়িত কাউন্টারের মান পরিবর্তিত হলে নিম্নলিখিত উদাহরণে কোড স্নিপেট অ্যাপটিকে অবহিত করে:

কোটলিন

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity(), DataClient.OnDataChangedListener {

    private var count = 0

    override fun onResume() {
        super.onResume()
        Wearable.getDataClient(this).addListener(this)
    }

    override fun onPause() {
        super.onPause()
        Wearable.getDataClient(this).removeListener(this)
    }

    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
            }
        }
    }

    // Method to update the count
    private fun updateCount(int: Int) { ... }
    ...
}

জাভা

public class MainActivity extends Activity implements DataClient.OnDataChangedListener {
    private static final String COUNT_KEY = "com.example.key.count";
    private int count = 0;

    @Override
    protected void onResume() {
        super.onResume();
        Wearable.getDataClient(this).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Wearable.getDataClient(this).removeListener(this);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                // DataItem changed
                DataItem item = event.getDataItem();
                if (item.getUri().getPath().compareTo("/count") == 0) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    updateCount(dataMap.getInt(COUNT_KEY));
                }
            } else if (event.getType() == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private void updateCount(int c) { ... }
    ...
}

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

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