الـ Parcelable في أندرويد

بسم الله الرحمن الرحيم

لإرسال البيانات بين two activities يوجد عدة طرق, كـ shared Preference و database, لكن الطريقة المباشرة للإرسال هي عن طريق Intent بإستخدام الدوال الخاصة بها putExtra() والتي تتعامل مع جميع الـ Primitive types بطريقة مباشرة, لكن في حال أردنا أن نرسل object أو list of objects سنضطر لإستخدام ما يسمى بـ parcelable.

بداية ما هو الـ parcelable, هو interface يعمل كعمل الـ Serializable في جافا لكن مخصص لأندرويد, يعمل على تحويل الـ object إلى byte واستعادته كـ object مرة أخرى وفي هذه المقالة سنتكلم عنه وعن الية التعامل معه.

 

لنفرض أن لدينا Student class

ولدينا two Activities  الأولى MainActivity والثانية ShowStudentActivity, سنحاول نقل object واحد ومن ثم نقل list of object.

سنقسم هذه المقالة إلى ثلاثة أقسام:

  1. نقوم بعمل implementation لـ Parcelable
  2. نقوم بتمرير object
  3. نقوم بتمرير list of object

لنبدأ بعمل implementation لـ Parcelable

بداية قمنا بعمل implementation لـ Parcelable, ثم override لدالتين, الأولى  describeContents والتي ترجع hash code الخاص بـ class, والثانية writeToParcel تحول data members إلى Parcel class, فنستخدم دوال Parcel class لتخزين بياناتنا, وهنا ينبغي الانتباه لترتيب data members عند الكتابة والقراءة حيث أنه في حال ما حدث تغيير في الترتيب قد يكون هناك crash لتطبيق.

بعد ذلك قمنا ببناء static field يسمى CREATOR وهو يستخدم من النظام – OS – لاستعادة البيانات – unparcel – , بداخلة دالتين أخرتين الأولى createFromParcel وهي تستخدم لإعادة بناء الـ object, ونلاحظ بداخلها استدعاء لـ constructor يستقبل parcel object لذلك سنقوم ببناء هذا constructor لاحقا, الدالة الثانية newArray وهي تستدعى في حال كان لديك مصفوفة – array – من الـ Parcelable ثم تستدعي الدالة الأولى createFromParcel عند بناء كل عنصر داخل هذه المصفوفة.

كما ذكرنا أن دالة createFromParcel تستدعي constructor يستقبل parcel object, ولهذا سنقوم ببنائه, وكما ذكرنا أيضا أن الترتيب مطلوب كما, قمنا بكتابة name أولا ثم id, سنقرأ بنفس الترتيب كالتالي

وبهذا يكون لدينا class نستطيع نقول بياناته بين الـ activity بشكل بسيط وسلس

سنقوم الان بنقل object واحد من هذا  class إلى Activity أخرى, كما هو معلوم التنقل بين الـ activites يكون دائما بإستخدام Intent, ولنقل البيانات نستخدم الدوال المساعدة في عملية النقل putExtra, هذه الدالة تستيع التعامل مع عدة انواع من المتغيرات – overloaded method – منها ال Parcelable, كما نلاحظ من داخل Intent class

لذا فيمكنا إرسال object كالتالي

واستقباله في  ShowStudentActivity بهذه الطريقة

سنقوم الان بنقل ArrayList من نفس الـ class بنفس الطريقة

ثم استعادتها في الـ Activity الأخرى

أندرويد ستديو له عدد من الإختصارات تسهل عمل implementation لـ Parcelable استعرضتها في هذا الفيديو:

إلى هنا نكون قد وصلنا إلى نهاية هذه المقالة, والسلام عليكم ورحمة الله وبركاته

 

المصادر:

https://www.survivingwithandroid.com/2012/09/passing-data-between-activities-2.html

https://stackoverflow.com/questions/22037801/parcelable-what-is-newarray-for

https://developer.android.com/reference/android/os/Parcel.html

 

اترك تعليقاً