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

تم تصميم العنصرين Parcelable وBundle للاستخدام عبر حدود العملية، مثل معاملات IPC/حافظة، وبين الأنشطة ذات الأغراض، وتخزين الحالة المؤقتة على مستوى تغييرات الإعدادات. تقدّم هذه الصفحة اقتراحات وأفضل الممارسات لاستخدام كائنَي 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 وأي تفاعل مع النظام. عند تجاوز حد الحجم، يتم طرح transactionTooMajorException.

بالنسبة إلى الحالة المحددة لـsaveInstanceState، يجب الاحتفاظ بكمية البيانات صغيرة لأن عملية النظام تحتاج إلى الاحتفاظ بالبيانات المقدمة طالما كان بإمكان المستخدم الرجوع إلى هذا النشاط في أي وقت (حتى إذا تم إنهاء عملية النشاط). ننصحك بإبقاء الحالة المحفوظة على أقل من 50 ألف بيانات.

ملاحظة: في نظام التشغيل Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يطرح النظام transactionToolargeException كاستثناء في وقت التشغيل. في الإصدارات الأقدم من Android، لا يعرض النظام إلا تحذيرًا في Logcat.