در قسمت اول و دوم در مورد چرخه حیات در اکتیویتی ها و فرگمنت ها صحبت کردیم. اگر آنها را مطالعه نکرده اید توصیه میکنم ابتدا آن را مطالعه و سپس این مطلب را ادامه دهید.
چرخه حیات اکتیویتی ها در اندروید
چرخه حیات فرگمنت ها در اندروید
در این مطلب قصد داریم چرخه حیات را به سبک جدیدتر و یکپارچه تر پیاده سازی کنیم.
احتمالا در برنامه هایی مثل دیوار و ... دیده اید که وقتی فرمی را پر میکنید اگر به هر دلیلی از برنامه خارج شوید اطلاعات وارد شده را به صورت پیش نویس ذخیره می شود و یا وقتی در یک موزیک پلیر در حال گوش کردن به آهنگ مورد علاقه تان هستید اگر فردی به گوشی تان تماس بگیرد آهنگ قطع می شود و بعد از پایان تماس با نمایان شدن موزیک پلیر مجددا آهنگ شروع به خواندن می کند. برای انجام دادن فعالیت های این چنینی نیاز به آگاهی نسبت به Lifecycle اکتیویتی و فرگمنت دارید.
مثلا در مثال موزیک پلیر چرخه حیات بدین شکل می باشد:
در متد On Create دستور init اجرا می شود.
در متد On Start دستور start اجرا می شود.
در متد On Pause دستور pause اجرا می شود.
در متد OnDestroy دستور release اجرا می شود.
این روشی بود که تا به امروز برای توسعه برنامه های خود استفاده میکردیم و همین روال در مورد مپ و یا موارد مشابه نیز انجام میدادیم.
حال فرض بگیرید که لازم باشد در چند اکتیویتی یا فرگمنت ، همین روال را برای یک پلیر ، مپ و ... استفاده کنیم که انجام این کارهای تکراری علاوه بر اینکه باعث ناخوانایی کدها می شود ، زمانبر نیز می باشد.
روش بهتر و منطقی تری که قصد داریم در این مطلب آن را با هم بررسی کنیم lifecycle aware می باشد. در این روش ، همه عملیات های مختلف مربوط به یک کامپوننت ( پلیر ، مپ و ...) را در یک کلاس مینویسیم که خود این کلاس تغییرات چرخه حیات را رصد کند و متناسب با رویدادهای چرخه حیات ، عملیات متناظر را اجرا میکند.
در قالب یک مثال نحوه پیاده سازی lifecycle aware را بررسی میکنیم:
در این مثال قصد داریم برنامه ای بنویسیم که مشابه برنامه دیوار که وقتی کاربر فرمی را پر میکند و از برنامه خارج می شود اطلاعات به صورت پیش نویس ذخیره شود ( لینک کامل برنامه را در انتهای پست میتوانید ببینید):
یک کلاس با نام DraftComponent مینویسیم و اینترفیس LifecycleObserver را پیاده سازی میکنیم.
یک تابع load برای خواندن اطلاعات از sharedPreferences و یک تابع save برای ذخیره اطلاعات در sharedPreferences نیاز داریم.
حال باید مشخص کنیم که تابع load باید در رویداد onCreate و تابع save در رویداد on Stop اجرا شود.
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void load(){
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void save() {
}
حال باید از کلاس DraftComponent در اکتیویتی یا فرگمنت خود استفاده کنیم:
public class MainActivity extends AppCompatActivity {
private DraftComponent lifecycle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addObserver();
}
@Override
protected void onDestroy() {
super.onDestroy();
removeObserver();
}
private void addObserver() {
lifecycle = new DraftComponent();
getLifecycle().addObserver(lifecycle);
}
private void removeObserver() {
getLifecycle().removeObserver(lifecycle);
}
}
به همین سادگی و به همین خوشمزگی کلاسی نوشتیم که lifecycle aware هست یعنی خوداگاه هست و از lifecycle آگاهی دارد و تغییرات آن را رصد می کند و خودش تصمیم میگیرد چه تابعی را اجرا کند.
استفاده از این روش باعث می شود :
از نوشتن های کدهای تکراری جلوگیری شود.
کدهای قابلیت استفاده مجدد (reusable) را دارند.
جداسازی خوبی بین منطق برنامه و view ها می شود.
برای درک بهتر مفهوم زیبای lifecycle aware می توانید سورس کد کامل این برنامه را از لینک زیر مشاهده کنید:
https://github.com/masoudmahmoodzadeh/Lifecycle-aware-Example
مطالعه داکیومنت گوگل هم بسیار مفید است:
https://developer.android.com/topic/libraries/architecture/lifecycle