من المفترض أن يكون العنصران Parcelable
وBundle
تُستخدم عبر حدود العملية، كما هو الحال مع IPC/Binder
المعاملات وبين الأنشطة ذات الأهداف وتخزين الحالة المؤقتة على مستوى جميع الإعدادات
التغييرات. تقدّم هذه الصفحة توصيات وأفضل الممارسات لاستخدام
كائنان 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
حاصلة على تقييم مرتفع.
محسنة للتنظيم والاستعداد باستخدام الأراضي.
في بعض الحالات، قد تحتاج إلى آلية لإرسال عناصر مركبة أو معقّدة خلال الأنشطة.
في هذه الحالات، يجب أن تنفذ الفئة المخصصة Parcelable، وتقدم
طريقة writeToParcel(android.os.Parcel, int)
.
يجب أيضًا توفير حقل غير فارغ يسمى CREATOR
والذي
تنفّذ الواجهة Parcelable.Creator
، التي
createFromParcel()
تُستخدم لتحويل Parcel
مرة أخرى إلى الكائن الحالي.
لمزيد من المعلومات
اطّلِع على المستندات المرجعية للعنصر Parcelable
.
عند إرسال البيانات عبر غرض، يجب توخي الحذر من تقييد حجم البيانات إلى بضعة كيلوبايت.
قد يؤدي إرسال الكثير من البيانات إلى قيام النظام بتوجيه
استثناء واحد (TransactionTooLargeException
).
إرسال البيانات بين العمليات
يشبه إرسال البيانات بين العمليات القيام بذلك بين الأنشطة. ومع ذلك، عند إرسال
ننصحك بعدم استخدام عناصر مخصّصة إذا أرسلت رسالة مخصصة
Parcelable
من تطبيق إلى آخر، يجب التأكد من
نفس إصدار الفئة المخصصة
الموجودة على كل من تطبيقات الإرسال والاستقبال. عادةً ما تكون هذه مكتبة مشتركة
في كلا التطبيقين. يمكن أن يحدث خطأ إذا كان التطبيق يحاول إرسال مادة شحن مخصّصة إلى
النظام، لأن النظام لا يمكنه إلغاء تنظيم فئة لا يعرفها.
على سبيل المثال، قد يضبط أحد التطبيقات تنبيهًا باستخدام
الفئة AlarmManager
، واستخدِم سمة Parcelable
مخصّصة
بشأن نية المنبّه. عندما يرنّ المنبّه، يعدّل النظام الغرض.
Bundle
من المزايا الإضافية المطلوب إضافتها
عدد التكرار. وقد يؤدي هذا التعديل إلى إزالة الحساب
Parcelable
من الميزات الإضافية. ويمكن أن يؤدي هذا بدوره إلى إزالة
عندما يتلقى التطبيق نية التنبيه المعدَّلة، لأنّ التطبيق يتوقع
تلقي بيانات إضافية لم تعد موجودة.
حجم المخزن المؤقت للمعاملات على Binder له حجم ثابت محدود، وهو حاليًا 1 ميغابايت، وتتم مشاركته بين جميع المستخدمين. المعاملات قيد التقدم لهذه العملية. لأنّ هذا الحدّ قيد المعالجة وليس على مستوى كل نشاط، تتضمن هذه المعاملات جميع معاملات المربط في التطبيق مثل onSaveInstanceState وstartActivity وأي تفاعل مع النظام. عندما يزيد حجم تم تجاوز الحد المسموح به، تم طرح TransactionToolargeException.
بالنسبة إلى الحالة المحدّدة الخاصة بـsaveInstanceState، يجب الاحتفاظ بكمية البيانات صغيرة لأنّ عملية النظام تحتاج إلى الاحتفاظ بالبيانات المقدَّمة ما دام المستخدم الرجوع إلى هذا النشاط (حتى إذا تم إنهاء عملية النشاط). ننصحك بإبقاء الحد المحفوظ في الحالة أقل من 50 ألف بيانات.
ملاحظة: في Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يطرح النظام transactionToolargeException كاستثناء لبيئة التشغيل. في الإصدارات الأقدم من Android، لا يعرض النظام إلا تحذيرًا في Logcat.