باقات قابلة للتقسيم

من المفترض أن يكون العنصران 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.