Parcelable और Bundle ऑब्जेक्ट का इस्तेमाल, प्रोसेस की सीमाओं के पार किया जा सकता है. जैसे, आईपीसी/बाइंडर ट्रांज़ैक्शन के साथ, इंटेंट वाली ऐक्टिविटी के बीच, और कॉन्फ़िगरेशन में बदलावों के दौरान कुछ समय के लिए स्थिति को सेव करने के लिए. इस पेज पर, Parcelable और Bundle ऑब्जेक्ट इस्तेमाल करने के लिए सुझाव और सबसे सही तरीके दिए गए हैं.
ध्यान दें: Parcel, सामान्य मकसद के लिए इस्तेमाल होने वाला सीरियलाइज़ेशन मेकेनिज़्म नहीं है. आपको कभी भी डिस्क पर Parcel डेटा सेव नहीं करना चाहिए या इसे नेटवर्क पर नहीं भेजना चाहिए.
गतिविधियों के बीच डेटा भेजना
जब कोई ऐप्लिकेशन, नई गतिविधि शुरू करने के लिए startActivity() में इस्तेमाल करने के लिए Intent ऑब्जेक्ट बनाता है, तो ऐप्लिकेशन, putExtra() तरीके का इस्तेमाल करके पैरामीटर पास कर सकता है.
नीचे दिए गए कोड स्निपेट में, इस कार्रवाई को करने का तरीका बताया गया है.
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
ओएस, इंटेंट के Bundle को पार्सल करता है. इसके बाद, ओएस नई ऐक्टिविटी बनाता है, डेटा को अन-पार्सल करता है, और इंटेंट को नई ऐक्टिविटी में पास करता है.
हमारा सुझाव है कि Bundle क्लास का इस्तेमाल करके, Intent ऑब्जेक्ट पर ओएस को पता चलने वाले प्रिमिटिव सेट करें. Bundle क्लास को पार्सल का इस्तेमाल करके मार्शेलिंग और अनमार्शेलिंग के लिए, काफ़ी हद तक ऑप्टिमाइज़ किया गया है.
कुछ मामलों में, आपको एक से ज़्यादा गतिविधियों के लिए जटिल ऑब्जेक्ट पास करने या उन्हें यूज़र इंटरफ़ेस (यूआई) की स्थिति में बनाए रखने की ज़रूरत पड़ सकती है.
ऐसे मामलों में, कस्टम क्लास को Parcelable लागू करना चाहिए. Kotlin और Jetpack Compose के आधुनिक ऐप्लिकेशन के लिए, हमारा सुझाव है कि आप @Parcelize एनोटेशन का इस्तेमाल करें. यह बंडल का इस्तेमाल करते समय, आपके डेटा को सुरक्षित तरीके से हैंडल करने के लिए ज़रूरी सीरियलाइज़ेशन लॉजिक को अपने-आप जनरेट करता है. rememberSaveable का इस्तेमाल करते समय, आपके डेटा को मैनेज करने के लिए भी इसी तरीके का इस्तेमाल किया जाता है.
@Parcelize का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Parcelable implementation generator देखें.
इंटेंट के ज़रिए डेटा भेजते समय, आपको डेटा के साइज़ को कुछ केबी तक सीमित रखना चाहिए.
बहुत ज़्यादा डेटा भेजने से, सिस्टम में TransactionTooLargeException गड़बड़ी हो सकती है.
प्रोसेस के बीच डेटा भेजना
प्रोसेस के बीच डेटा भेजने का तरीका, गतिविधियों के बीच डेटा भेजने के तरीके जैसा ही होता है. हालांकि, प्रोसेस के बीच डेटा भेजते समय, हमारा सुझाव है कि आप कस्टम पार्सलेबल का इस्तेमाल न करें. अगर आपको एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन में कस्टम Parcelable ऑब्जेक्ट भेजना है, तो आपको यह पक्का करना होगा कि कस्टम क्लास का एक जैसा वर्शन, भेजने और पाने वाले, दोनों ऐप्लिकेशन पर मौजूद हो. आम तौर पर, यह एक सामान्य लाइब्रेरी होती है, जिसका इस्तेमाल दोनों ऐप्लिकेशन में किया जाता है. अगर आपका ऐप्लिकेशन सिस्टम को कोई कस्टम पार्सलेबल भेजने की कोशिश करता है, तो गड़बड़ी हो सकती है. ऐसा इसलिए, क्योंकि सिस्टम ऐसी क्लास को अनमार्शल नहीं कर सकता जिसके बारे में उसे जानकारी नहीं है.
उदाहरण के लिए, कोई ऐप्लिकेशन AlarmManager क्लास का इस्तेमाल करके अलार्म सेट कर सकता है. साथ ही, अलार्म इंटेंट पर कस्टम Parcelable का इस्तेमाल कर सकता है. अलार्म बजने पर, सिस्टम इंटेंट के Bundle में बदलाव करता है, ताकि दोहराने की संख्या जोड़ी जा सके. इस बदलाव की वजह से, सिस्टम अतिरिक्त जानकारी से कस्टम Parcelable हटा सकता है. इस वजह से, जब ऐप्लिकेशन को बदला गया अलार्म इंटेंट मिलता है, तो वह क्रैश हो सकता है. ऐसा इसलिए होता है, क्योंकि ऐप्लिकेशन को ऐसे अतिरिक्त डेटा की ज़रूरत होती है जो अब मौजूद नहीं है.
Binder ट्रांज़ैक्शन बफ़र का साइज़ सीमित होता है. फ़िलहाल, यह 1 एमबी है. इसे प्रोसेस के लिए, सभी चालू ट्रांज़ैक्शन के साथ शेयर किया जाता है. यह सीमा, हर ऐक्टिविटी के लेवल पर नहीं, बल्कि प्रोसेस के लेवल पर होती है. इसलिए, इन लेन-देन में ऐप्लिकेशन के सभी बाइंडर लेन-देन शामिल होते हैं. जैसे, startActivity, rememberSaveable (जो onSaveInstanceState का इस्तेमाल करता है) और सिस्टम के साथ कोई भी इंटरैक्शन. साइज़ की सीमा से ज़्यादा होने पर, TransactionTooLargeException दिखता है.
rememberSaveable के साथ स्थिति को सेव करने के खास मामले में, डेटा की मात्रा कम रखनी चाहिए. इसकी वजह यह है कि सिस्टम प्रोसेस को दिए गए डेटा को तब तक सेव रखना होता है, जब तक उपयोगकर्ता उस गतिविधि पर वापस नहीं आ जाता. भले ही, गतिविधि की प्रोसेस बंद हो गई हो.
हमारा सुझाव है कि सेव किए गए स्टेट का डेटा 50 केबी से कम हो.
ध्यान दें: Android 7.0 (एपीआई लेवल 24) और इसके बाद के वर्शन में, सिस्टम रनटाइम अपवाद के तौर पर TransactionTooLargeException दिखाता है.
Android के पुराने वर्शन में, सिस्टम सिर्फ़ logcat में चेतावनी दिखाता है.