Parcelable
और Bundle
ऑब्जेक्ट
इसका इस्तेमाल, आईपीसी/बाइंडर जैसी प्रोसेस की सीमाओं में किया जाता है
इंटेंट वाली गतिविधियों के बीच और कॉन्फ़िगरेशन में अस्थायी स्थिति को स्टोर करने के लिए लेन-देन
बदलाव. इस पेज पर, आपको Google Analytics 4 पर माइग्रेट करने के लिए सुझाव और सबसे सही तरीके
Parcelable
और Bundle
ऑब्जेक्ट.
ध्यान दें: Parcel
इस्तेमाल नहीं किया जा सकता
क्रम से लगाने की सुविधा इस्तेमाल की जा रही है, जिसे आपको
किसी भी Parcel
डेटा को डिस्क पर संग्रहित करें या उसे नेटवर्क पर भेजें.
गतिविधियों के बीच डेटा भेजना
जब कोई ऐप्लिकेशन, इस्तेमाल करने के लिए Intent
ऑब्जेक्ट बनाता है
नई गतिविधि शुरू करने में startActivity(android.content.Intent)
,
ऐप्लिकेशन पास हो सकता है
putExtra(java.lang.String, java.lang.String)
का इस्तेमाल करने वाले पैरामीटर
तरीका.
नीचे दिया गया कोड स्निपेट, इस काम को करने के तरीके का उदाहरण दिखाता है.
Kotlin
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
Java
Intent intent = new Intent(this, MyActivity.class); intent.putExtra("media_id", "a1b2c3"); // ... startActivity(intent);
ओएस, इंटेंट के Bundle
को पार्स करता है. इसके बाद, ओएस,
नई गतिविधि,
डेटा को पार्स करता है और इंटेंट को नई गतिविधि में भेजता है.
हमारा सुझाव है कि आप ओएस में इस्तेमाल किए जाने वाले प्रिमिटिव सेट करने के लिए, Bundle
क्लास का इस्तेमाल करें
Intent
ऑब्जेक्ट. Bundle
क्लास का कॉन्टेंट बहुत ज़्यादा है
इसे पार्सल की मदद से, मार्शलिंग और अनमार्शलिंग के लिए ऑप्टिमाइज़ किया गया है.
कुछ मामलों में, आपको सभी गतिविधियों में कंपोज़िट या कॉम्प्लेक्स ऑब्जेक्ट भेजने के लिए किसी तरीके की ज़रूरत पड़ सकती है.
ऐसे मामलों में, कस्टम क्लास को पार्स किया जा सकने वाला एलिमेंट लागू करना चाहिए और सही
writeToParcel(android.os.Parcel, int)
तरीका.
इसमें CREATOR
नाम वाला एक ऐसा फ़ील्ड भी होना चाहिए जो खाली न हो
Parcelable.Creator
इंटरफ़ेस को लागू करता है, जो
createFromParcel()
तरीके का इस्तेमाल, Parcel
को वापस मौजूदा ऑब्जेक्ट में बदलने के लिए किया जाता है.
ज़्यादा जानकारी के लिए,
Parcelable
ऑब्जेक्ट के लिए रेफ़रंस दस्तावेज़ देखें.
किसी इंटेंट के ज़रिए डेटा भेजते समय, आपको डेटा के आकार को कुछ केबी तक सीमित करने का ध्यान रखना चाहिए.
बहुत ज़्यादा डेटा भेजने से सिस्टम
TransactionTooLargeException
अपवाद.
अलग-अलग प्रोसेस के बीच डेटा भेजना
अलग-अलग प्रोसेस के बीच डेटा भेजना, गतिविधियों के बीच डेटा भेजने जैसा ही है. हालांकि, भेजते समय
हमारा सुझाव है कि आप कस्टम पार्सल का इस्तेमाल न करें. अगर आपने
एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन में Parcelable
ऑब्जेक्ट है, आपको पक्का होना चाहिए कि
कस्टम क्लास का ठीक यही वर्शन है
भेजने और पाने, दोनों ऐप्लिकेशन में मौजूद होता है. आम तौर पर, यह एक सामान्य लाइब्रेरी हो सकती है
का इस्तेमाल किया जा सकता है. अगर आपका ऐप्लिकेशन कस्टम पार्सल को इस पर भेजने की कोशिश करता है, तो गड़बड़ी हो सकती है
क्योंकि सिस्टम किसी ऐसे क्लास को अनमार्शल नहीं कर सकता जिसके बारे में उसे जानकारी नहीं है.
उदाहरण के लिए, कोई ऐप्लिकेशन
AlarmManager
क्लास का इस्तेमाल कर सकते हैं. साथ ही, पसंद के मुताबिक Parcelable
का इस्तेमाल कर सकते हैं
अलार्म के इंटेंट पर सेट कर देते हैं. अलार्म बजने पर, सिस्टम इंटेंट में बदलाव करता है
जोड़ने के लिए Bundle
और पाएं
बार-बार होने की गिनती कर सकता है. इस बदलाव की वजह से सिस्टम,
अतिरिक्त सेवाओं में से Parcelable
. इसके बदले में, इस प्रक्रिया से ऐप्लिकेशन का
ऐप्लिकेशन बंद हो जाता है, क्योंकि ऐप्लिकेशन डिफ़ॉल्ट तौर पर ऐसा करता है
अतिरिक्त डेटा पाएं जो अब मौजूद नहीं है.
बाइंडर ट्रांज़ैक्शन बफ़र का साइज़ तय होता है. फ़िलहाल, इसका साइज़ एक एमबी है, जिसे सभी शेयर करते हैं जो प्रोसेस में जारी हैं. यह सीमा प्रोसेस में है प्रति गतिविधि स्तर की बजाय, इन लेन-देन में सभी बाइंडर लेन-देन शामिल होते हैं जैसे कि onSaveInstanceState, startActivity, और सिस्टम के साथ होने वाला कोई भी इंटरैक्शन. जब साइज़ सीमा पार हो जाती है, एक TransactionTooLarge विशेषता है.
सेव किए गए उदाहरण के मामले में, डेटा की मात्रा कम होनी चाहिए क्योंकि सिस्टम प्रोसेस को तब तक के लिए उपलब्ध डेटा को बनाए रखना पड़ता है, जब तक उपयोगकर्ता उस गतिविधि पर वापस नेविगेट कर सकें (भले ही गतिविधि की प्रक्रिया खत्म हो गई हो). हमारा सुझाव है कि आप सेव की गई स्थिति को 50 हज़ार से कम डेटा पर रखें.
ध्यान दें: Android 7.0 (एपीआई लेवल 24) और उसके बाद के वर्शन में, सिस्टम रनटाइम अपवाद के तौर पर TransactionTooLargeअपवाद. Android के पुराने वर्शन में, सिस्टम सिर्फ़ Logcat में चेतावनी दिखाता है.