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

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

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

অ্যাক্টিভিটিগুলোর মধ্যে ডেটা পাঠানো

যখন কোনো অ্যাপ একটি নতুন Activity শুরু করার জন্য startActivity() ফাংশনে ব্যবহারের উদ্দেশ্যে একটি Intent অবজেক্ট তৈরি করে, তখন অ্যাপটি putExtra() মেথড ব্যবহার করে প্যারামিটার পাস করতে পারে।

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

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

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

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

কিছু ক্ষেত্রে, আপনার অ্যাক্টিভিটিগুলোর মধ্যে জটিল অবজেক্ট পাস করার বা সেগুলোকে UI স্টেটে সংরক্ষণ করার প্রয়োজন হতে পারে। এই ধরনের ক্ষেত্রে, কাস্টম ক্লাসটির Parcelable ইমপ্লিমেন্ট করা উচিত। আধুনিক Kotlin এবং Jetpack Compose অ্যাপের জন্য, @Parcelize অ্যানোটেশন ব্যবহার করার পরামর্শ দেওয়া হয়। এটি বান্ডেল (Bundles) ব্যবহার করার সময় আপনার ডেটা নিরাপদে পরিচালনা করার জন্য প্রয়োজনীয় সিরিয়ালাইজেশন লজিক স্বয়ংক্রিয়ভাবে তৈরি করে। rememberSaveable ব্যবহার করার সময় আপনার ডেটা পরিচালনা করার জন্যও একই পদ্ধতি ব্যবহার করা হয়। @Parcelize ব্যবহার সম্পর্কে আরও তথ্যের জন্য, Parcelable ইমপ্লিমেন্টেশন জেনারেটর দেখুন।

ইন্টেন্টের মাধ্যমে ডেটা পাঠানোর সময়, ডেটার আকার কয়েক কিলোবাইটের মধ্যে সীমিত রাখতে সতর্ক থাকা উচিত। অতিরিক্ত ডেটা পাঠালে সিস্টেমটি একটি TransactionTooLargeException এক্সেপশন দেখাতে পারে।

প্রসেসগুলির মধ্যে ডেটা পাঠানো

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

উদাহরণস্বরূপ, একটি অ্যাপ AlarmManager ক্লাস ব্যবহার করে একটি অ্যালার্ম সেট করতে পারে এবং অ্যালার্ম ইন্টেন্টে একটি কাস্টম Parcelable ব্যবহার করতে পারে। যখন অ্যালার্মটি বেজে ওঠে, তখন সিস্টেম একটি রিপিট কাউন্ট যোগ করার জন্য ইন্টেন্টের ' Bundle of extras' পরিবর্তন করে। এই পরিবর্তনের ফলে সিস্টেম 'extras' থেকে কাস্টম Parcelable টিকে বাদ দিয়ে দিতে পারে। এই বাদ দেওয়ার ফলে, অ্যাপটি যখন পরিবর্তিত অ্যালার্ম ইন্টেন্টটি গ্রহণ করে, তখন সেটি ক্র্যাশ করতে পারে, কারণ অ্যাপটি এমন অতিরিক্ত ডেটা পাওয়ার আশা করে যা আর সেখানে থাকে না।

বাইন্ডার ট্রানজ্যাকশন বাফারের একটি সীমিত নির্দিষ্ট আকার রয়েছে, যা বর্তমানে ১ মেগাবাইট এবং প্রসেসের জন্য চলমান সমস্ত ট্রানজ্যাকশন এই বাফারটি ব্যবহার করে। যেহেতু এই সীমাটি অ্যাক্টিভিটি-ভিত্তিক না হয়ে প্রসেস-ভিত্তিক, তাই এই ট্রানজ্যাকশনগুলোর মধ্যে অ্যাপের সমস্ত বাইন্ডার ট্রানজ্যাকশন অন্তর্ভুক্ত থাকে, যেমন startActivity , rememberSaveable (যা অভ্যন্তরীণভাবে onSaveInstanceState ব্যবহার করে), এবং সিস্টেমের সাথে যেকোনো ইন্টারঅ্যাকশন। যখন এই আকারের সীমা অতিক্রম করা হয়, তখন একটি TransactionTooLargeException থ্রো করা হয়।

For the specific case of saving state with rememberSaveable , the amount of data should be kept small because the system process needs to hold on to the provided data for as long as the user can ever navigate back to that activity (even if the activity's process is killed). We recommend that you keep saved state to less than 50KB of data.

দ্রষ্টব্য: অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং এর উচ্চতর সংস্করণে, সিস্টেম একটি রানটাইম এক্সেপশন হিসেবে TransactionTooLargeException থ্রো করে। অ্যান্ড্রয়েডের নিম্নতর সংস্করণগুলিতে, সিস্টেম শুধুমাত্র লগক্যাটে একটি সতর্কবার্তা দেখায়।