পার্সেবল এবং বান্ডিল

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

দ্রষ্টব্য: Parcel একটি সাধারণ-উদ্দেশ্য সিরিয়ালাইজেশন প্রক্রিয়া নয়, এবং আপনার কখনই ডিস্কে Parcel ডেটা সংরক্ষণ করা বা নেটওয়ার্কের মাধ্যমে পাঠানো উচিত নয়।

কার্যকলাপের মধ্যে ডেটা পাঠানো

যখন একটি অ্যাপ একটি নতুন কার্যকলাপ শুরু করার জন্য startActivity(android.content.Intent) ব্যবহার করার জন্য একটি Intent অবজেক্ট তৈরি করে, অ্যাপটি putExtra(java.lang.String, java.lang.String) পদ্ধতি ব্যবহার করে প্যারামিটারে পাস করতে পারে।

নিম্নলিখিত কোড স্নিপেট এই অপারেশনটি কিভাবে সম্পাদন করতে হয় তার একটি উদাহরণ দেখায়।

কোটলিন

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

জাভা

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

OS উদ্দেশ্যটির অন্তর্নিহিত Bundle পার্সেল করে। তারপর, OS নতুন কার্যকলাপ তৈরি করে, ডেটা আন-পার্সেল করে এবং নতুন কার্যকলাপে অভিপ্রায় পাস করে।

আমরা সুপারিশ করি যে আপনি Intent অবজেক্টে OS-এ পরিচিত আদিম সেট করতে Bundle ক্লাস ব্যবহার করুন। পার্সেল ব্যবহার করে মার্শালিং এবং আনমার্শালিং করার জন্য Bundle শ্রেণীটি অত্যন্ত অপ্টিমাইজ করা হয়েছে।

কিছু ক্ষেত্রে, আপনার ক্রিয়াকলাপ জুড়ে যৌগিক বা জটিল বস্তু পাঠানোর জন্য একটি প্রক্রিয়ার প্রয়োজন হতে পারে। এই ধরনের ক্ষেত্রে, কাস্টম ক্লাসের Parcelable প্রয়োগ করা উচিত এবং উপযুক্ত writeToParcel(android.os.Parcel, int) পদ্ধতি প্রদান করা উচিত। এটি CREATOR নামক একটি নন-নাল ফিল্ডও প্রদান করতে হবে যা Parcelable.Creator ইন্টারফেস প্রয়োগ করে, যার createFromParcel() পদ্ধতি Parcel বর্তমান অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। আরও তথ্যের জন্য, Parcelable বস্তুর জন্য রেফারেন্স ডকুমেন্টেশন দেখুন।

একটি অভিপ্রায়ের মাধ্যমে ডেটা পাঠানোর সময়, আপনার ডেটার আকারকে কয়েক KB-তে সীমাবদ্ধ করার বিষয়ে সতর্ক হওয়া উচিত। অত্যধিক ডেটা পাঠানোর ফলে সিস্টেমটি একটি TransactionTooLargeException ব্যতিক্রম নিক্ষেপ করতে পারে।

প্রসেসের মধ্যে ডেটা পাঠানো

প্রক্রিয়াগুলির মধ্যে ডেটা পাঠানো ক্রিয়াকলাপের মধ্যে এটি করার অনুরূপ। যাইহোক, প্রক্রিয়াগুলির মধ্যে পাঠানোর সময়, আমরা সুপারিশ করি যে আপনি কাস্টম পার্সেবল ব্যবহার করবেন না। আপনি যদি একটি অ্যাপ থেকে অন্য অ্যাপে একটি কাস্টম Parcelable অবজেক্ট পাঠান, তাহলে আপনাকে নিশ্চিত হতে হবে যে কাস্টম ক্লাসের একই সংস্করণ পাঠানো এবং গ্রহণ করা উভয় অ্যাপেই উপস্থিত রয়েছে। সাধারণত এটি উভয় অ্যাপ জুড়ে ব্যবহৃত একটি সাধারণ লাইব্রেরি হতে পারে। আপনার অ্যাপ যদি সিস্টেমে একটি কাস্টম পার্সেলেবল পাঠানোর চেষ্টা করে তবে একটি ত্রুটি ঘটতে পারে, কারণ সিস্টেমটি এমন একটি ক্লাসকে আনমার্শাল করতে পারে না যার সম্পর্কে এটির কোন জ্ঞান নেই৷

উদাহরণস্বরূপ, একটি অ্যাপ AlarmManager ক্লাস ব্যবহার করে একটি অ্যালার্ম সেট করতে পারে এবং অ্যালার্মের অভিপ্রায়ে একটি কাস্টম Parcelable ব্যবহার করতে পারে। যখন অ্যালার্ম বন্ধ হয়ে যায়, তখন সিস্টেমটি একটি পুনরাবৃত্ত গণনা যোগ করতে অভিপ্রায়ের অতিরিক্ত Bundle পরিবর্তন করে। এই পরিবর্তনের ফলে সিস্টেম অতিরিক্ত থেকে কাস্টম Parcelable ছিনিয়ে নিতে পারে। পরিবর্তিত অ্যালার্মের অভিপ্রায় গ্রহণ করার সময় এই স্ট্রিপিংয়ের ফলে অ্যাপটি ক্র্যাশ হয়ে যেতে পারে, কারণ অ্যাপটি অতিরিক্ত ডেটা পাওয়ার আশা করে যা আর নেই।

বাইন্ডার লেনদেন বাফারের একটি সীমিত নির্দিষ্ট আকার রয়েছে, বর্তমানে 1MB, যা প্রক্রিয়াটির জন্য প্রগতিশীল সমস্ত লেনদেনের দ্বারা ভাগ করা হয়৷ যেহেতু এই সীমাটি প্রতি ক্রিয়াকলাপের স্তরের পরিবর্তে প্রক্রিয়া স্তরে, তাই এই লেনদেনের মধ্যে অ্যাপের সমস্ত বাইন্ডার লেনদেন যেমন onSaveInstanceState, startActivity এবং সিস্টেমের সাথে যে কোনও মিথস্ক্রিয়া অন্তর্ভুক্ত রয়েছে৷ আকার সীমা অতিক্রম করা হলে, একটি TransactionTooLargeException নিক্ষেপ করা হয়।

সংরক্ষিত ইনস্ট্যান্স স্টেটের নির্দিষ্ট ক্ষেত্রে, ডেটার পরিমাণ কম রাখা উচিত কারণ সিস্টেম প্রক্রিয়াটিকে প্রদত্ত ডেটা ধরে রাখতে হবে যতক্ষণ ব্যবহারকারী সেই কার্যকলাপে ফিরে যেতে পারে (এমনকি কার্যকলাপের প্রক্রিয়াটি মারা গেলেও)। আমরা আপনাকে 50k এর কম ডেটা সংরক্ষণ করার পরামর্শ দিচ্ছি।

দ্রষ্টব্য: Android 7.0 (API স্তর 24) এবং উচ্চতর, সিস্টেমটি রানটাইম ব্যতিক্রম হিসাবে একটি TransactionTooLargeException নিক্ষেপ করে। অ্যান্ড্রয়েডের নিম্ন সংস্করণে, সিস্টেমটি শুধুমাত্র লগক্যাটে একটি সতর্কতা দেখায়।