ارسال اطلاعات بین Activity اندروید
در تمام زبان های برنامه نویسی, داده های برنامه بسیار اهمیت دارند. در این مقاله قصد داریم تا داده هارا بین Activity های اندروید ارسال کنیم.
در زبان های شی گرا, چندین اطلاعات را با استفاده از چندین متغیر ارسال نمیکنیم. برای مثال فرض کنید که قصد داریم تا اطلاعات یک کاربر را از یک Activity به Activity دیگر انتقال دهیم. اگر اطلاعات ما شامل سه متغیر نام کاربری, رمز عبور و رایانامه باشد, این سه متغیر را درون یک کلاس مدل قرار میدهیم و کلاس مدل را به عنوان اطلاعات کاربر جابجا میکنیم. در واقع از سطح متغیر به سطح کلاس میرویم. پس تا به اینجا با علت جابجایی کلاس ها بین Activity ها آشنا شدیم.
serializable
برای ارسال یک کلاس, این کلاس باید خاصیت Serializable بودن را دارا باشد. وقتی از Serialize صبحت به میان میآید, به این معنا است که حالت فعلی یک Object به byte stream ها تبدیل شود. آنگاه خاصیت جابجایی پیدا میکند. این جابجایی ممکن است در تمام سطوح انتقال داده ای رخ دهد. برای مثال جابجایی میتواند در شبکه و یا بین دو activity باشد. بنابراین کلاسی که Serializable است, میتواند Serialize شود. تمام نوع متغیر هایی که در زبان جاوا به صورت پیش فرض تعریف شده اند, مانند int, String, float و … Serializable هستند. در واقع کلاس هایی که به صورت پیش فرض در جاوا هستند و برای نگهداری مقدار استفاده میشوند, Serializable هستند. وقتی که بخواهیم این کلاس ها را ارسال کنیم, به صورت stream قابل ارسال هستند. همچنین این Stream ها در مقصد نیز قابل desrialize هستند و به حالتی که کلاس در سمت فرستنده ذخیره شده بود, باز میگردد. برای Serializable کردن یک کلاس, باید از Serializable Interface استفاده شود:
public class ZeroToHeroSerializableModel implements Serializable { private String token; private String username; private String password; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public ZeroToHeroModel(String token, String username, String password) { this.token = token; this.username = username; this.password = password; } }
توجه داشته باشید تمام متغیر های درون کلاس هم باید Serializable باشند.
Parcelable
parcelable, یک نوع پیاده سازی Java Serializable در اندروید است. این پیاده سازی یک ساختار معین و پردازش مختص به خود را دارد. کلاس های Parcelable بسیار سریع تر از کلاس های Serializable پردازش میشوند. برای مثال کلاس فوق را میتوان به این صورت پیاده سازی کرد:
public class ZeroToHeroParcelableModel implements Parcelable { private String token; private String username; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } private String password; public ZeroToHeroModel(Parcel in) { token = in.readString(); username = in.readString(); password = in.readString(); } public ZeroToHeroModel(String token, String username, String password) { this.token = token; this.username = username; this.password = password; } public static final Creator<ZeroToHeroModel> CREATOR = new Creator<ZeroToHeroModel>() { @Override public ZeroToHeroModel createFromParcel(Parcel in) { return new ZeroToHeroModel(in); } @Override public ZeroToHeroModel[] newArray(int size) { return new ZeroToHeroModel[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(token); parcel.writeString(username); parcel.writeString(password); } }
در ساختار کلاس های Parcelable یک متد static به نام CREATOR باید وجود داشته باشد که Creator interface را پیاده سازی کند.
وقتی از کلاس Parcelable ارث بری شود, متد describeContents باید override شود. مقداری که این متد در کلاس های ارث برنده برمیگرداند, نوع object که ساخته میشود را مشخص میکند. برای مثال اگر کلاس ZeroToHeroModel2 از این کلاس ارث بری کند, میتواند مقدار ۱ و کلاس دیگری که از کلاس مدل ارث بری میکند مقدار ۲ را بر گرداند. به این ترتیب تمایز بین کلاس ها مشخص میشود. این ساختار یک ساختار ثابت و مشخص برای تمام کلاس های مدلی است که بخواهیم به صورت Parcelable پیاده سازی کنیم. در واقع تنها متغیر ها متفاوت خواهند بود و باید توجه داشت که در متد writeToParcel, از متد هایی از parcel استفاده شود که متناسب با نوع متغیر است.
جابجایی مدل ها
در نهایت برای جابجایی مدل ها بین activity ها باید از چنین دستوراتی استفاده کرد. شیوه ارسال مدل های Serializable و Parcelable کاملا مشابه است:
Intent intent = new Intent(this, ZeroToHero.class); ZeroToHeroSerializableModel zeroToHeroSerialModel = new ZeroToHeroSerializableModel("token", "vdhrjb", "1234"); intent.putExtra("SerializableModel", zeroToHeroModel); ZeroToHeroParcelableModel zeroToHeroParcelModel = new ZeroToHeroParcelableModel("token", "vdhrjb", "1234"); intent.putExtra("ParcelableModel", zeroToHeroModel);
و در کلاس مقصد نیز میتوان به این صورت این کلاس را دریافت کرد:
Bundle bundle = getIntent().getExtras(); if (bundle != null) { ZeroToHeroSerializableModel zeroToHeroSerialModel = bundle.getSerializable("SerializableModel"); ZeroToHeroParcelableModel zeroToHeroParcelModel = bundle.getParcelable("ParcelableModel"); }
در این مقاله سعی بر این شد تا با انواع پیاده سازی های کلاس مدل و همچنین ارسال این کلاس بین activity ها را بررسی کنیم.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.