الحزم و التوزيع

الإعلانات

الحزم و التوزيع

 

الهدف من إستخدام كائنات الحزم و التوزيع عبر حدود العمليات مثل إجراءات IPC/Binder ، وبين الأنشطة ذات الأغراض، ولتخزين حالة عابرة خلال تغييرات التكوين.

تقدم هذه الصفحة توصيات وأفضل الممارسات لإستخدام كائنات Parcelable و Bundle.

 

ملاحظة: لا يعد Parcel آلية تسلسل للأغراض العامة، ويجب عليك عدم تخزين أي بيانات توزيع على القرص أو إرسالها عبر الشبكة.

 

 

 

 

إرسال البيانات بين الأنشطة


عندما يقوم تطبيق بإنشاء كائن غرض لإستخدامه في (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 إلى حدٍ كبير، من أجل التنظيم واللاتنظيم، بإستخدام التوزيع parcels

 

في بعض الحالات، قد تحتاج إلى آلية لإرسال كائنات مركبة أو معقدة عبر الأنشطة. في مثل هذه الحالات..

يجب على الفئة المخصصة تنفيذ Parcelable، وتوفير الدالة المناسبة (writeToParcel(android.os.Parcel، int .

يجب أيضاً توفير حقل غير فارغ يسمى “المنشئ” CREATOR الذي يقوم بتنفيذ واجهة Parcelable.Creator ..

التي تستخدم دالة ()createFromParcel لتحويل التوزيع إلى الكائن الحالي. لمزيد من المعلومات، راجع الوثائق المرجعية للكائن Parcelable.

عند إرسال البيانات عبر غرض، يجب عليك توخي الحذر، للحد من حجم البيانات إلى بضعة كيلوبايت.

قد يؤدي إرسال الكثير من البيانات إلى قيام النظام بطرح إستثناء TransactionTooLargeException.

 

 

 

إرسال البيانات بين العمليات


إرسال البيانات بين العمليات مشابه لإرسالها بين الأنشطة. ومع ذلك، عند الإرسال بين العمليات، نوصيك بعدم إستخدام parcelables المخصصة.

إذا أرسلت كائن parcelables مخصص من تطبيق إلى آخر، فيجب أن تكون متأكداً من وجود نفس الإصدار المحدد للفئة المخصصة..

على كلٍ من تطبيقات الإرسال والاستقبال. عادة ما تكون هذه المكتبة شائعة الإستخدام عبر كلا التطبيقين.

يمكن أن يحدث خطأ إذا حاول تطبيقك إرسال parcelables مخصص إلى النظام، لأن النظام لا يمكنه ألا ينظّم فئة لا يعرف عنها.

مثال، قد يقوم أحد التطبيقات بتعيين تنبيه بإستخدام فئة AlarmManager، ويستخدم Parcelable مخصص على غرض التنبيه.

عندما ينطفئ التنبيه، يقوم النظام بتعديل حزمة الغرض الإضافية لإضافة عدد تكرار. هذا التعديل يمكن أن يؤدي إلى..

تجريد النظام لـparcelables المخصص من الإضافات. يمكن أن يؤدي هذا بدوره إلى تعطيل التطبيق عند تلقيه لغرض التنبيه المعدل..

لأن التطبيق يتوقع أن يتلقي بيانات إضافية لم تعد موجودة.

 

 

يحتوي المخزن المؤقت لمعاملة الحزم على حجم ثابت محدود، حالياً 1 ميغابايت، يتم مشاركته بواسطة كافة المعاملات قيد التقدم في العملية.

لأن هذا الحد على مستوى العملية وليس على مستوى النشاط، تتضمن هذه المعاملات جميع المعاملات الموثقة في التطبيق..

مثل onSaveInstanceState و startActivity وأي تفاعل يحدث مع النظام. عندما يتم تجاوز حد الحجم، يتم طرح TransactionTooLargeException.

بالنسبة للحالة المحددة لـ saveInstanceState ، يجب أن تبقى كمية البيانات صغيرة لأن عملية النظام تحتاج إلى الإحتفاظ..

بالبيانات المتوفرة، طالما أن المستخدم يمكنه العودة مرة أخرى، إلى هذا النشاط (حتى إذا تم قتل عملية النشاط).

نوصيك بالإحتفاظ بالحالة المحفوظة، إلى أقل من 50 كيلو بايت من البيانات.

 

ملاحظة: في أندرويد 7.0 (مستوى API 24) والإصدارات الأحدث، يقوم النظام بطرح TransactionTooLargeException كإستثناء وقت تشغيل.

في الإصدارات الأقل من الأندرويد، يعرض النظام تحذيراً فقط في سجل الأخطاء logcat.

 

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

اترك رد