آشنایی با چرخه حیات اکتیویتی در اندروید

در چرخه فعالیت یا lifecycle اکتیویتی ،زمانی که یکی از فعالیت اکتیویتی ها از بین می رود و مجددا وارد فعالیت می شود، می توانید نحوه رفتار activity را کنترل کنید.

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

زمانیکه با اجرای یک اکتیویتی، عمل اکتیویتی دیگری متوقف میشود، این تغییر از طریق روش های پاسخگویی در چرخه حیات اکتیویتی (activity’s lifecycle callback methods) ، شناخته می شود. چندین روش پاسخگویی برای هر اکتیویتی که ناشی از تغییر در وضعیت آن است، وجود دارد. روشهایی مانند سیستم در حال ساخت activity است (creating activity)، در حال متوقف کردن آن است ( stopping activity)، درحال ازسرگیری پردازش است (resuming activity) یا درحال ازبین بردن آن است (destroying activity).

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

به عنوان مثال،

1 – با دریافت یک تماس تلفنی یا سوئیچ به یک برنامه برنامه شما خطا می دهد.

2 – باعث بالا رفتن مصرف منابع مهم می شود.

3 – از دست دادن کاربر.

4 – پرش از برنامه وقتی کاربر صفحه را به صورت عمودی می چرخاند.

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

مفاهیم چرخه حیاط اکتیویتی

 ()onCreate – هنگامی که اکتیویتی برای اولین بار ایجاد می شود، فراخوانی می شود.

 ()onStart – هنگامی که اکتیویتی به کاربر نمایش داده می شود فراخوانی می گردد.

 ()onResume – هنگامی که اکتیویتی شروع به تعامل با کاربر می کند، فراخوانی می شود.

 ()onPause – هنگامی که اکتیویتی کنونی موقتا نگه داشته می شود و activity قبلی در حال شروع به کار شدن است، فراخوانی می شود.

 ()onStop – هنگامی که دیگر اکتیویتی به کاربر نمایش داده نمی شود، فراخوانی می شود.

 ()onDestroy – قبل از اینکه اکتیویتی کاملا از بین برود، توسط سیستم فراخوانی می شود.

 ()onRestart – هنگامی که اکتیویتی پس از توقف دوباره شروع به کار می کند، فراخوانی می شود.

چرخه حیات یک اکتیویتی

خب همان طور که در تصویر بالا می بینید زمان های مختلفی از یک activity نشان داده شده که خانه اندروید مهمترین بخش ها را خدمت شما معرفی می کند  وقتی کاربر وارد یک اکتیویتی می شود برای اولین بار برنامه اندرویدی ما وارد  متد onCreate میشود و کدهای موجود در ان رو Run می کند. حالا اگه کاربر بر روی یک دکمه کلیک کند و وارد یه اکتیویتی جدید شود اکتیویتی قبلی وارد onPause میشود و اگر کاربر مدت زمان زیادی را وارد activity قبلی نشود اکتیویتی وارد onStop و بعد مدتی هم وارد onDestroy میشود .

خب حالا اگر اکتیویتی داخل onPause باشد و کاربر به activity برگردد کدهای موجود در onResume اجرا میشود ولی اگر اکتیویتی بسته شده باشد کدهای داخل onCreate از نو شروع میشود .

Lifecycle callbacks

1 – () onCreate :

()onSaveInstanceState متدی است که شما می توانید با آن وضعیت فعلی اکتیویتی تان را ذخیره کنید. سیستم این متد را قبل از اینکه activity نابود شود و به شیئ Bundle فرستاده شود، فرا میخواند. Bundle جایی است که شما می توانید اطلاعات مربوط به وضعیت اکتیویتی تان را مانند نام ها با استفاده از متد ()putString، ذخیره کنید. حال اگر سیستم اکتیویتی شما را نابود کند و کاربر به اکتیویتی برگردد، سیستم Bundle را به ()onCreate ارسال میکند و بنابراین با این روششما می توانید وضعیت قبلی اکتیویتی تان را که با استفاده از متد ()onSaveInstanceState ذخیره کرده بودید، بازیابی کنید. اگر اطلاعاتی برای بازیابی موجود نباشد، مقدار Bundleی که به ()onCreate ارسال شده است، تهی (null) خواهد بود.

 

 2 – () onStart :

درست قبل از اینکه اکتیویتی برای کاربر قابل مشاهده باشد، فراخوانی می شود. اگر activity به جلو یا پشت دیگر اکتیویتی ها برود، باید متدهای ()onResume و ()onStop بعد از آن اجرا شود.

3 – () onResume :

این متد دقیقاً قبل از اینکه activity بخواهد با کاربر تعاملش را آغاز کند، فراخوانی میشود. در این زمان، اکتیویتی در بالاترین نقطه انباره (Stack) قرار دارد و میتواند با کاربر در تعامل باشد. همیشه بعد از آن متد ()onPause باید اجرا شود.

 

 

4 – () onPause :

این متد زمانی فراخوانی میشود که اکتیویتی دیگری میخواهد اجرا شود (Resume). بطور معمول از این متد برای انجام کارهایی مانند ذخیره اطلاعاتی که هنوز ذخیره نشده اند، توقف انیمیشن و یا سایر کارهایی که CPU را بخودش درگیر کرده است، استفاده میشود. هر کاری که قرار است انجام شود باید بسیار سریع انجام شود زیرا تا زمانیکه وظیفه این متد انجام نشود، اکتیویتی بعدی اجرا نمیشود. متد بعد از این ()onResume است اگر activity مجدداً بخواهد به نمایش درآید و یا ()onStop است اگر بخواهد از دید و دسترس کاربر پنهان شود.

5 – () onStop :

زمانی اجرا میشود که اکتیویتی دیگر در دسترس کاربر نیست. این متد ممکن است بدلیل اینکه دارد نابود میشود، یا بدلیل اینکه اکتیویتی دیگری (چه اکتیویتی ای که قبلاً اجرا شده و الان در استک است و چه activity جدید باشد) کارش را از سر گرفته است و دستور اینکار را داده باشد ، اجرا شود. متد بعد از آن ()onRestart است اگر اکتیویتی میخواهد برگردد تا در دسترس کاربر قرار گیرد و یا ()onDestroy است اگر activity بخواهد نابود شود.

6 – () onDestroy :

این متد دقیقاً قبل از اینکه اکتیویتی بخواهد نابود شود، اجرا میشود. بعبارت دیگر این متد آخرین فراخوانی است که activity دریافت خواهد کرد. این فراخوانی ممکن است به این دلیل باشد که اکتیویتی به پایان انجام وظیفه اش رسیده است (کسی متد ()finish را اجرا کرده است)، یا سیستم بمنظور در اختیار گرفتن فضای بیشتر نیاز دارد تا بعضی از activity را نابود کند. متد ()isFinishing وجه تمایز دو سناریوی فوق است.

وضعیت Activity و خروج از حافظه

Likelihood of being killed Process state Activity state
Least Foreground (having or about to get focus) Created
Started
Resumed
More Background (lost focus) Paused
Most Background (not visible) Stopped
Most Empty Destroyed

 

  • جدول رابطه بین چرخه حیات پردازش و وضعیت اکتیویتی

حرکت بین فعالیت ها:

شاید در طول اجرای برنامه چندین بار از یک activity خارج و یا وارد آن شوید. به عنوان مثال، کاربر ممکن است دکمه برگشت دستگاه را لمس کند یا ممکن است از یک activity به اکتیویتی دیگر برود. این بخش مباحثاتی را که شما باید بدانید و برای پیاده سازی Activity های مختلف استفاده کنید را پوشش می دهد. این موضوعات شامل شروع یک Activity از Activity دیگر، صرفه جویی در حالت Activity و بازگرداندن حالت Activity است.

شروع یک Activity

بسته به اینکه آیا Activity شما می خواهد نتیجه را از یک Activity جدید شروع کند و یا ممکن است Activity جدید را با استفاده از روش  ()startActivity یا () startActivityForResult  شروع کنید. در هر صورت، شما یک شی (Intent) Object را منتقل میکنید.

Intent در لغت به معنای انجام کار است. در اندروید هم تا حدود زیادی همین معنی را می رساند. به اینصورت که به واسطه intent به سیستم عامل اندروید اعلام می کنیم قصد انجام چه کاری را داریم و سیستم عامل چه کاری باید برای ما انجام دهد. به طور کلی اینتنت واسطی است مابین کامپوننت های مختلف (شامل Activity ها، Service ها، Broadcast Receiver ها) درون یک اپلیکیشن و یا مابین چند اپلیکیشن. کاربرد های متعددی برای اینتنت وجود دارد که شاید ساده ترین آن را بتوان انتقال بین دو Activity درون یک اپلیکیشن دانست. در Intent  شما می توانید فعالیت و نوع آنرا مشخص کنید. یک Intent همچنین می تواند مقادیر کوچکی از داده ها را که توسط Activity هایی که آغاز شده است، حمل کند.

مطلب مرتبط:‌ آموزش کامل استفاده از Intent در اندروید

  () startActivity :

وقتی که با اپلیکیشن کار می کنید شما اغلب نیاز دارید که به از یک activity به اکیتیویتی دیگر بروید یا (launch) کنید.برای مثال کد زیر نشان می دهد که چگونه می توان با استفاده از intent یک activity را صدا زد :

برنامه شما ممکن است بخواهد که یک (action) یا یک فعالیت را مانند ارسال ایمیل ی ارسال یک پیام (message) در این صورت میتوان intent را به صورت زیر تغییر داد :

در بالا از EXTRA_EMAIL استفاده شده است یک آرایه رشته ای از آدرس های ایمیل می باشد که باید بصورت ایمیل فرستاده شود.

() startActivityForResult :

لزومی وجود ندارد که شروع activity های دیگر یکطرفه باشد. همچنین می توانید activity دیگری را شروع و نتیجه ای را دریافت کنید. برای دریافت نتیجه به جای startActivity() می توانید از () startActivityForResult, را فراخوانی کنید.

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

البته activity ای که پاسخ می دهد باید برای برگرداندن یک نتیجه طراحی شود. هنگامی که این را انجام می دهد، این نتیجه به عنوان یک شی مقصد دیگر ارسال می شود. activity شما آن را در پاسخ onActivityResult() دریافت می کند.

هنگامی که activity کاربر با activity های پس از آن و مقدار بازگشتی به اتمام می رسد، سیستم تابع onActivityResult() activity شما را فراخوانی می کند. این تابع شامل سه آرگومان است:

1          کد درخواستی که شما به () startActivityForResult فرستاده اید .

2          کد نتیجه توسط activity دوم مشخص شده است.اگر عملیات موفقیت آمیز باشد این RESULT_OK و RESULT_CANCELED اگر کاربر خارج شود یا عملیات ناموفق باشد.

3          مقصودی که حامل داده های نتیجه می باشد.

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

منظور از callback lifecycle به خوبی تعریف شده است به خصوص وقتی که دو activity در فعالیت یکسان هستند.یعنس وقتی که اکتیویتی A اکتیویتی B را صدا میزند:

  • متد () OnPause اجرا می شود برای اکتیویتی A.
  • متد onCreate(), onStart(), and onResume() در اکتیویتی B در حال اجرا هستند
  • اگر اکتیویتی A به مدت طولانی نمایش داده نشود متد onStop() اجرا می شود.

   ذخیره و بازگرداندن حالت اکتیویتی

چند سناریو وجود دارد که در آن activity شما به دلیل رفتار برنامه از بین می رود، مانند زمانی که کاربر بر روی دکمه Back کلیک کند یا فعالیت خود را با فراخوانی متد  ()  finish تمام میکند. ممکن است وقتی از یک activity خارج می شوید اطلاعات مربوز به آن activity از بین برود مانند مقادیر ذخیره در متغیر ها یا اگر activity در حالت متوقف باشد و در مدت زمان طولانی مورد استفاده قرار نگرفته باشد یا اکتیویتی پیشین به منابع بیشتری نیاز داشته باشد.

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

() onSaveInstanceState متدی است که شما می توانید با آن وضعیت فعلی اکتیویتی تان را ذخیره کنید. سیستم این متد را قبل از اینکه اکتیویتی نابود شود و به شیئ Bundle فرستاده شود، فرا میخواند. Bundle جایی است که شما می توانید اطلاعات مربوط به وضعیت اکتیویتی تان را مانند نام ها با استفاده از متد () putString، ذخیره کنید. حال اگر سیستم اکتیویتی شما را نابود کند و کاربر به activity برگردد، سیستم Bundle را به () onCreate ارسال میکند و بنابراین با این روششما می توانید وضعیت قبلی اکتیویتی تان را که با استفاده از متد () onSaveInstanceState ذخیره کرده بودید، بازیابی کنید. اگر اطلاعاتی برای بازیابی موجود نباشد، مقدار Bundleی که به () onCreate ارسال شده است، تهی (null) خواهد بود.

 

برای ذخیره اطلاعات مربوط به activity خود، شما باید بر روی () SaveInstanceState  باید به صورت زیر عمل کنید:

بازگرداندن حالت اکتیویتی:

وقتی activity شما بعد نابود شدن دوباره ساخته و کار خود را شروع می کندشما می توانید تنظیماتی که دخیره کرده اید را بازیابی کنید با استفاده از متد onCreate() و onRestoreInstanceState()

 

شما ممکن است به جای ()onCreate از متد ()onRestoreInstanceState استفاده کنید.متد ()onRestoreInstanceState فقط تنظیمات ذخیره شده را باز می گرداند.

 

 

 

درباره ShopDroid

فروشگاه توسعه دهندگان موبایل شاپ دروید با بیش از 7 سال سابقه مفتخر است که اولین و بهترین فروشگاه سورس می باشد

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *