باقات قابلة للتقسيم
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
من المفترض أن يكون العنصران 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.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Parcelables and bundles\n\n[Parcelable](/reference/android/os/Parcelable) and [Bundle](/reference/android/os/Bundle) objects are intended to be\nused across process boundaries such as with IPC/Binder\ntransactions, between activities with intents, and to store transient state across configuration\nchanges. This page provides recommendations and best practices for using\n[Parcelable](/reference/android/os/Parcelable) and [Bundle](/reference/android/os/Bundle) objects.\n\n**Note:** [Parcel](/reference/android/os/Parcel) is not a general-purpose\nserialization mechanism, and you should never\nstore any [Parcel](/reference/android/os/Parcel) data on disk or send it over the network.\n\nSending data between activities\n-------------------------------\n\n\nWhen an app creates an [Intent](/reference/android/content/Intent) object to use in\n[startActivity(android.content.Intent)](/reference/android/app/Activity#startActivity(android.content.Intent)) in starting a new Activity,\nthe app can pass in\nparameters using the [putExtra(java.lang.String, java.lang.String)](/reference/android/content/Intent#putExtra(java.lang.String, java.lang.String))\nmethod.\n\nThe following code snippet shows an example of how to perform this operation. \n\n### Kotlin\n\n```kotlin\nval intent = Intent(this, MyActivity::class.java).apply {\n putExtra(\"media_id\", \"a1b2c3\")\n // ...\n}\nstartActivity(intent)\n```\n\n### Java\n\n```java\nIntent intent = new Intent(this, MyActivity.class);\nintent.putExtra(\"media_id\", \"a1b2c3\");\n// ...\nstartActivity(intent);\n```\n\n\nThe OS parcels the underlying [Bundle](/reference/android/os/Bundle) of the intent. Then, the OS creates\nthe new activity,\nun-parcels the data, and passes the intent to the new activity.\n\n\nWe recommend that you use the [Bundle](/reference/android/os/Bundle) class to set primitives known to the OS on\n[Intent](/reference/android/content/Intent) objects. The [Bundle](/reference/android/os/Bundle) class is highly\noptimized for marshalling and unmarshalling using parcels.\n\n\nIn some cases, you may need a mechanism to send composite or complex objects across activities.\nIn such cases, the custom class should implement Parcelable, and provide the appropriate\n[writeToParcel(android.os.Parcel, int)](/reference/android/os/Parcelable#writeToParcel(android.os.Parcel, int)) method.\nIt must also provide a non-null field called `CREATOR` that\nimplements the [Parcelable.Creator](/reference/android/os/Parcelable.Creator) interface, whose\n[createFromParcel()](/reference/android/os/Parcelable.Creator#createFromParcel(android.os.Parcel))\nmethod is used for converting the [Parcel](/reference/android/os/Parcel) back to the current object.\nFor more information,\nsee the reference documentation for the [Parcelable](/reference/android/os/Parcelable) object.\n\n\nWhen sending data via an intent, you should be careful to limit the data size to a few KB.\nSending too much data can cause the system to throw a\n[TransactionTooLargeException](/reference/android/os/TransactionTooLargeException) exception.\n\nSending data between processes\n------------------------------\n\n\nSending data between processes is similar to doing so between activities. However, when sending\nbetween processes, we recommend that you do not use custom parcelables. If you send a custom\n[Parcelable](/reference/android/os/Parcelable) object from one app to another, you need to be certain that the\nexact same version of the custom class is\npresent on both the sending and receiving apps. Typically this could be a common library\nused across both apps. An error can occur if your app tries to send a custom parcelable to\nthe system, because the system cannot unmarshal a class that it has no knowledge of.\n\n\nFor example, an app might set an alarm using\nthe [AlarmManager](/reference/android/app/AlarmManager) class, and use a custom [Parcelable](/reference/android/os/Parcelable)\non the alarm intent. When the alarm goes off, the system modifies the intent's\n[Bundle](/reference/android/os/Bundle) of extras to add\na repeat count. This modification can result in the system's stripping the custom\n[Parcelable](/reference/android/os/Parcelable) from the extras. This stripping, in turn, can result in the app's\ncrashing when it receives the modified alarm intent, because the app expects to\nreceive extra data that is no longer there.\n\n\nThe Binder transaction buffer has a limited fixed size, currently 1MB, which is shared by all\ntransactions in progress for the process. Since this limit is at the process\nlevel rather than at the per activity level, these transactions include all binder transactions in\nthe app such as onSaveInstanceState, startActivity and any interaction with the system. When the size\nlimit is exceeded, a TransactionTooLargeException is thrown.\n\n\nFor the specific case of savedInstanceState, the amount of data should be kept small\nbecause the system process needs to hold on to the provided data for as long as the user\ncan ever navigate back to that activity (even if the activity's process is killed).\nWe recommend that you keep saved state to less than 50k of data.\n\n\n**Note:** In Android 7.0 (API level 24) and higher, the system throws a\nTransactionTooLargeException as a runtime exception.\nIn lower versions of Android, the system only shows a warning in logcat."]]