آموزش ارسال آبجکت به اکتیویتی دیگر در اندروید
انتقال آبجکت بین اکتیویتیها با استفاده از Intent (اینتنت)
همانطور که در مطلب «Intent چیست» گفته شد، از Intent ها برای انتقال دادهها در نقش پستچی و در موارد مختلفی استفاده میشود! همچنین در مطلب یاد شده، به نحوهی ارسال دادههای ساده (عددی، رشته و …) از یک اکتیویتی به اکتیویتی دیگر نیز اشاره کردیم؛ ولی به نحوهی ارسال یک آبجکت نپرداختیم!
البته ممکن است شما با استفاده از روشهایی مثل static کردن یک فیلد، در اکتیویتیهای مختلفی به آن دسترسی داشته باشید؛ ولی خب این روش در هر موردی صحیح نیست!
نحوه انجام کار
فرض کنید قصد داریم تا از FuLLKadeActivity به TestActivity برویم! و در اینجا آبجکتی به نام note در اختیار داریم. شما همانند روش ساده، با استفاده از متد putExtra میتوانید آبجکت را در intent قرار دهید:
Intent intent = new Intent(FuLLKadeActivity.this, TestActivity.class); Note note = new Note(); intent.putExtra("note", note); FuLLKadeActivity.this.startActivity(intent);
همانطور که میدانید، در ورودی اول متد putExtra، یک کلید (نام دلخواه) برای دسترسی به مقدار وارد شده در اکتیویتی دوم مینویسیم و در ورودی دوم این متد نیز مقدار را قرار میدهیم!
حالا چیزی که اتفاق میافتد این است که کامپایلر، از این خط از کد خطا میگیرد و به شما میگوید که نمیتوانید این مقدار را ارسال کنید!
چارهی کار این است که به کلاس آبجکت مورد نظر رفته و اینترفیس Serializable را روی آن پیاده سازی کنیم! این اینترفیس متدی ندارد و تنها خاصیت سریالایز شدن را برای کلاس شما فراهم میآورد! این مورد را به صورت کلیشهای یاد بگیرید.
class Note implements Serializable { .... }
حالا ارور از بین میرود! ولی یک چیز دیگر باقی میماند و آن نحوهی گرفتن مقدار در اکتیویتی دوم است!
آیا این کار به روشی که قبلا گفته شده است صورت میگیرد؟! یعنی به صورت زیر:
bundle = getIntent().getExtras(); if (bundle != null) { Note note = (Note) bundle.getObject("note"); }
با نوشتن کد بالا کامپایلر از شما خطا میگیرد! بنابراین باید به روش دیگری عمل کنیم!
ما آبجکت را به صورت زیر دریافت میکنیم:
Note note = (Note) getIntent().getSerializableExtra("note");
پس از متد getSerializableExtra در خود intent دریافت شده استفاده میکنیم و کاری با Extras یا همان bundle نداریم! و همچنین توجه داشته باشید که اگر مقداری ارسال نشده باشد، null برگردانده میشود؛ پس در کد بالا اگر null برگردانده شود، مقدار note برابر null خواهد بود!
دوست عزیز ممنون بسیار آموزنده بود …. ولی یه سوال حالا اگه بخوایم آرایه ای از آبجکت ها رو انتقال بدین چکار می کنین؟؟؟
فرقی نداره بازم مثل همین عمل میکنین چون ArrayList و امثالشم خاصیت سریالایز رو دارن