وبلاگ - مطالب آموزشی

0
273
انتقال داده بین اکتیویتی ها با کمک Android Parcelable

انتقال داده بین اکتیویتی ها با کمک Android Parcelable

به طور معمول اپلیکیشن های اندروید دارای چندین اکتیویتی هستند و لازم است داده ها بین این اکتیویتی ها رد و بدل شوند. برای نمونه یک اکتیویتی اولیه با لیستی از عناصر و اکتیویتی دوم که به نمایش این عناصر می پردازد را در نظر بگیرید. جهت جابجایی از یک اکتیویتی به دیگری از کلاس intent جهت برقراری ارتباط بین آنها استفاده می شود، این کار شما را قادر به لانچ یک اکتیویتی و بازگرداندن اختیاری آن در آینده می سازد.

ارسال داده بین اکتیویتی ها بخشی از فرآیند به شمار می رود و این کار توسط متدهای putExtra و getExtra از آبجکت intent صورت می پذیرد. ایده اصلی تسهیل فرآیند ارسال انواع گوناگون داده به شکل زیر می باشد:

این روش برای انواع داده های مقدماتی مانند رشته، بولین و اعداد صحیح کفایت می کند، اما برای آبجکت ها مناسب نیست، چنانچه مایل به ارسال آبجکت و داده های آن از یک اکتیویتی به دیگری باشید چه باید بکنید؟ برای این منظور می توان رابط parcelable را مورد استفاده قرار داد.

معرفی رابط Parcelable

از آنجا که آبجکت ها ممکن است شامل انواع گوناگونی از داده ها باشند، از این رو نمی توانید جهت جابجایی مقادیر از putExtra استفاده کنید. جاوا دارای قابلیت serialize کردن آبجکت ها می باشد، اما این فرآیند کند است و سیستم نیازمند اجرای جابجایی های سنگینی برای انتقال داده ها می باشد. Parcelable یک رابط اندرویدی است که برای serialize کردن یک کلاس و ویژگی های آن جهت انتقال از یک اکتیویتی به دیگری مورد استفاده قرار می گیرد.

پیاده سازی Parcelable

رابط Parcelable متدها را به تمامی کلاس هایی که مایل به جابجایی بین اکتیویتی ها هستید، می افزاید.  برای این مثال نگاهی به نحوه پیاده سازی Parcelable در یک کلاس ساده می اندازیم، ایده کلی این است که وقتی یک ویژگی در لیست ویو را انتخاب می کنید، به ویوی جزئیات گسترده تر جهت دریافت اطلاعات بیشتر هدایت شوید.blog_21540_1

ساخت یک کلاس Property

اول از همه باید یک کلاس بسازید که تمامی اطلاعات درباره هر ویژگی را در خود نگه دارد، کار را با افزودن کدهای زیر به یک فایل کلاس جدید در پروژه آغاز کنید.

کلاس شامل مجموعه ای از ویژگی ها، توابع getter و یک سازنده برای ساخت آبجکت منفرد از کلاس می باشد.

افزودن رابط Parcelable

جایگذاری رابط مهم ترین بخش می باشد، تعریف کلاس را مطابق زیر عوض کنید:

متدهای زیر را داخل کلاس اضافه کنید، در ادامه نحوه عملکرد هریک شرح داده خواهد شد.

Parcelable نیازمند این کد برای انجام عملیات می باشد، در حقیقت وظیفه آن مدیریت فرآیند کپی داده های آبجکت به یک Parcel برای انتقالات بین اکتیویتی ها و ساخت مجدد آبجکت در سمت دیگر می باشد.

متد نوشتن – writeToParcel

در این متد تمامی ویژگی های کلاس را به parcel جهت آماده سازی برای انتقال اضافه می کنید و از متد های write جهت اضافه کردن هریک از ویژگی ها بهره می گیرید.

نکات:

– ترتیب نوشتن مقادیر اهمیت دارد و در دریافت این مقادیر باید به همان ترتیبی که آنها را نوشته اید، عمل کنید.

– چنانچه مایل به ارسال مقادیر بولین مانند ویژگی featured هستید، باید از writeValue استفاده کرده و سپس در سمت دیگر آن را به بولین تبدیل کنید، زیرا هیچ متد نیتیوی جهت افزودن بولین وجود ندارد.

متد خواندن – Property

این متد سازنده است و در زمان دریافت اکتیویتی صدا زده می شود و در این مرحله باید به دریافت مقادیر بپردازید.

زمانی که اکتیویتی دوم متد getParcelableExtra از آبجکت intent را صدا می زند تا فرآیند شروع شود، این سازنده مقادیر را می گیرید و ویژگی های هر آبجکت را تعیین می کند.

در این مرحله آبجکت با داده ها پر می شود.

چنانچه از آبجکت منحصر به فرد خود استفاده می کنید، نام تابع باید با نام کلاسی که ساخته اید مطابقت داشته باشد، برای نمونه person ،animal ،place، نام باید مطابق با نام کلاس باشد.

متد سازنده

Parcelable نیازمند این متد برای بایند کردن بخش ها با یکدیگر است و متد createFromParcel کل آبجکت پر شده را برمی گرداند.

سایر متدها – describeContents

این متد عملیات زیادی را به انجام نمی رساند.

شروع Intent در اکتیویتی اول

در داخل اکتیویتی اول آبجکت intent خود را ساخته و از متد putExtra جهت اضافه کردن کل کلاس بهره بگیرید. تنها در صورتی که رابط Parcelable را به درستی جایگذاری کرده باشید، این متد کار کرده و Parcelable عملیات serialize کردن آبجکت را آغاز می نماید.

در صورتی که عملیات به درستی انجام شود، اکتیویتی دوم باز می شود. در این مرحله باید مطمئن شوید که اکتیویتی به فایل مانیفست شما اضافه شده است.

دریافت مقادیر در اکتیویتی دوم

هم اکنون در اکتیویتی دوم هستید و باید آبجکت intent را گرفته و کلاس property را که به یک parcel تبدیل شده، استخراج نمایید. پس از انجام این کار می توانید متدهای استاندارد را فراخوانی کرده و داده هایی مانند نام، قیمت و توضیحات را بگیرید.

ارسال Parcel

همانطور که مشاهده می کنید، برای راه اندازی و کار با parcelable نیازمند انجام کارهای اضافه هستید، اما قطعا نتیجه ای که دریافت می کنید ارزشمند است.

شما می توانید کل آبجکت ها را از یک اکتیویتی به دیگری منتقل کرده و تمامی متدها و قابلیت های کلاس را حفظ کنید. این عملکرد برای شرایطی که دارای یک متد پیچیده هستید که تمامی داده های شما را منتقل می سازد، بسیار کاربردی خواهد بود.

دیگر نیازی به یادآوری اسامی مختلف که به طور معمول به آبجکت intent به عنوان داده های اضافی ارسال می کنید نیست. برای مثال

شما می توانید آبجکت را گرفته و کار را ادامه دهید.

این فرآیند سریع و بهینه است و انجام آن سریع تر از استفاده از عملکرد serialize جاوا می باشد.

 

منبع:

https://www.sitepoint.com

 

این نوشته را به گوگل توصیه کنید :

بسته های آموزشی جذاب!بیشتر