منبع:راسخون
اکتیویتی
اکتیویتی ها اصلی ترین عناصر سازنده هر برنامه اندروید هستند. هر صفحه برنامه که می بینید، در اصل یک اکتیویتی است. اکتیویتی ها در عین این که تعریف ساده ای دارند ولی ساختار آنها تقریباً پیچیده است. هر اکتیویتی از یک کلاس جاوا و یک یا چند فایل XML طراحی layout، تعدای عناصر گرافیکی مثل عکسها و آیتمهای گرافیکی، انیمیشن ها، منو و … ساخته می شود. در واقع می توان گفت قسمت هایی از برنامه که کاربر می بیند اکتیویتی اند. اکتیویتی ها ممکن است با هم کار کنند تا یک اپلیکیشن به صورت یکپارچه به نظر رسد، اما در واقع از هم مستقل هستند. یک اکتیویتی در اندروید بخش اصلی یک اپلیکیشن در طول عمر آن است . هر اکتیویتی به عنوان یک پیاده سازی کلاس پایه ی اکتیویتی اجرا می شود.تقریبا همه ی اکتیویتی ها با کاربران فعل و انفعال دارند، بنابراین کلاس اکتیویتی با ایجاد پنجره برای قرار دادن UI با کاربران فعل و انفعال می کند. اکتیویتی ها اغلب در مد full-screen ارائه می شود، اما در بعضی نمونه ها، شما می توانید یک اکتیویتی شناور در یک پنجره یا جاسازی شده در اکتیویتی دیگر بیابید- این به عنوان گروه اکتیویتی معروف است.
برای ساخت اکتیویتی، باید یک زیر کلاس از Activity بسازید(یا یک زیر کلاس از کلاسهای موجود). در زیر کلاستان، باید متدهای پاسخگویی را اجرا کنید تا سیستم بداند در وضعیت های مختلف چه کارهایی باید انجام دهد، مثلاً زمانیکه اکتیویتی درحال ساخته شدن، درحال توقف، درحال از سرگیری کار و یا در حال از بین رفتن است .
کار با متد ها، پشته ها و وضعیت ها
تقریبا همه ی اکتیویتی ها متد های زیر را اجرا می کند:OnCreate: این متد اکتیویتی شما را مقدار دهی اولیه می کند. مهمتر اینکه، این امکان را بوجود می آورد تا به اکتیویتی بگوید که از کدام Layout برای شناسه های منابع layout استفاده می کند. این می تواند نقطه ی ورودی برای اکتیویتی تان در نظر گیرد. این متد را باید به صورت اجباری اجرا کنید. سیسم این متد را زمانیکه در حال ساخت اکتیویتی است، صدا میزند. در زمان اجرا، شما باید کامپوننت هایی را که در اکتیویتان معرفی کرده اید را مقداردهی(initialaze) کنید.
OnPause: سیستم زمانی این متد را اجرا می کند که کاربر در حال ترک این اکتیویتی است یا آن را قطع می کند. مهمتر از همه این است که هرگونه تغییر ایجاد شده توسط کاربر باید در همین نقطه اجرا شود(اگر نیاز به ذخیره ی آن باشد).
اکتیویتی ها در سیستم در یک پشته ی اکتیویتی اداره می شود. زمانیکه یک اکتیوتی جدید ایجاد می شود، در بالای پشته قرار می گیرد و فعالیت در حال اجرا می شود. فعالیت های در حال اجرای قبلی همیشه زیر آن در پشته باقی می مانند و تا زمانیکه فعالیت جدید خارج نشود به پیش زمینه وارد نمی شوند.
اساسا یک اکتیویتی در چهار وضعیت قرار می گیرد. همانطور که در جدول زیر نشان داده شده است:
وضعیت اکتیویتی |
توضیحات |
Active/running |
اکتیویتی در پیش زمینه صفحه نمایش قرار دارد(در بالای پشته) |
Paused |
اکتیویتی تمرکزش را از دست داده اما هنوز هم قابل مشاهده است. اکتیویتی موقتا متوقف شده اما کاملا زنده است، به این معنی که به طور کامل می تواند وضعیت و اطلاعات اعضا را حفظ کند و همچنان وابسته به مدیر پنجره (که در اندروید پنجره ها را کنترل می کند) باقی بماند. با این حال توجه داشته باشید که در حالی که حافظه کم باشد، اکتیویتی می تواند توسط سیستم اندروید کشته شود. |
Stopped |
اگر یک اکتیویتی کامل شود توسط اکتیویتی دیگر محو می شود، در واقع متوقف شده است. همهی وضعیت ها و اطلاعات اعضا ذخیره می شود، اما برای کاربر قابل مشاهده نیست. بنابراین پنجره پنهان می شود و اگر در جای دیگر به حافظه نیاز شود، توسط سیستم اندروید کشته می شود. |
Create and resuming |
سیستمی که اکتیویتی را paused یا stop کرده است، می تواند یا حافظه را از طریق درخواست پایان، پس بگیرد یا می تواند پردازش را بکشد. زمانیکه این اکتیویتی می خواهد به کاربر نمایش داده شود، باید با راه اندازی مجدد(restart ) از سرگیری شود و وضعیت قبلی اش برگردد. |
پیگیری چرخه ی حیات یک اکتیویتی
به عقیده ی من تصاویر به اندازه ی هزاران کلمه با ارزش است و نمودار جریان ده برابر آن با ارزشند. نمودار زیر مسیر های مهم یک اکتیویتی را نشان می دهند. این چرخه ی حیات اکتیویتی است.مستطیل ها نشان دهنده ی متدهای پاسخگویی هستند که شما با آنها می توانید به وضعیت های مختلف و رویدادها در فعالیت ها پاسخ دهید. بیضی های سایه دار وضعیت های مهم هستند که اکتیویتی می تواند در آن حالت باشند.
بازبینی حلقه های کلیدی
با اجرای این متدها می توانید شاهد سه حلقه تودرتو در چرخه ی حیات اکتیویتی باشید:ممکن است شما علاقمند باشید تا این سه حلقه را در اکتیویتی تان بازبینی کنید:
1- طول عمر اکتیویتی(entire lifetime) بین اولین فراخوانی متد onCreate() اتفاق می افتد یعنی با فراخوانی متد onCreate() شروع می شود و در آخر متد onDestroy() را فراخوانی می کند. اکتیویتی همه ی تنظیمات کلی را در onCreate() را انجام می دهد و وضعیت عمومی اکتیویتی باید در متد onCreate() تعریف شود و همه ی منابع باقیمانده را در onDestroy آزاد می کند.
برای مثال، اگر شما یک نخ برای دانلود یک فایل از اینترنت ایجاد کنید، ممکن است در متد onCreate() مقدار دهی اولیه شود و در این متد ساخته می شود و این نخ می تواند در متد onDestroy() متوقف شود.
2- طول عمر قابل رویت بودن(visible lifetime) اکتیویتی بین فراخوانی متد onStart() و onstop() رخ می دهد. یعنی در طی این زمان، برنامه برای کاربر قابل مشاهده است و می تواند با آن کار کند. بعنوان مثال ، متد onStop() زمانی صدا زده می شود که اکتیویتی جدیدی اجرا شده و اکتیویتی ما دیگر قابل رویت نباشد و در دسترس نباشد. در فاصله ی اجرای این دو متد می توانید از منابع مورد نیازتان در اکتیویتی تان استفاده کنید تا به کاربر نشان داده می شود. در طی طول عمر اکتیویتی، سیستم ممکن است چندین بار متدهای onstart() و onStop() را اجرا کند. البته این عمل به دستور کاربر انجام می شود.
3- طول عمر قابل دسترس بودن(Foreground Lifetime) اکتیویتی فاصله ی بین فراخوانی متدهای onResume() و onPause() است. در طی این مدت، اکتیویتی بر روی سایر اکتیویتی ها در حال اجرا شدن است. صفحه نمایشگر را در اختیار دارد و کاربر می تواند با آن ارتباط داشته باشد. اکتیویتی می تواند چندین بار بین این دو وضعیت حرکت کند.
مشاهده متد اکتیویتی
همه ی متد ها می توانند بازنویسی شوند و کدهای سفارشی می تواند در همه ی آنها قرار گیرد تا پاسخ مورد نظر را به وضعیت های مختلف دهید. همه ی اکتیویتی ها برای مقدار دهی اولیه، onCreate() را implement می کنند(برای اطلاعات در مورد implement کردن به آموزش جاوا SE بخش جنریک مراجعه کنید) و برای پاکسازی onPause() را implement می کنند. همیشه زمان implement کردن متد ها باید سوپرکلاس (کلاس پایه) فراخوانی شود:***
تعقیب مسیر یک اکتیویتی
به طور کلی، حرکت یک اکتیویتی در چرخه ی حیاتش شبیه زیر است.قابل کشته شدن بعد از اجرا یعنی آیا سیستم می تواند اکتیویتی را بعد از انجام وظیفه اش در آن متد(بدون اجرا شدن حتی یک خط دیگر از کدهای نوشته شده برای اکتیویتی) نابود کند.
onCreate(): زمانیکه اکتیویتی برای اولین بار ایجاد شده، فراخوانی می شود. این در جایی است که شما می خواهید بسیاری از متغییرهای class-wide اکتیویتی تان را مقدار دهی اولیه کنید و می توانید تمام خصوصیات ثابت برنامه تان مانند ساخت view ها، قراردادن اطلاعات در لیست و .. را انجام می دهید. onStart() همیشه در بعدش فراخوانی می شود.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: خیر
متد بعدی آن: onStart()
onRestart(): بعد از اینکه یک اکتیویتی stop شد، برای شروع دوباره ی آن این متد فراخوانی می شود. بعد از آن همیشه onStart() فراخوانی می شود.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: خیر
متد بعدی آن: onStart()
onStart(): درست قبل از اینکه اکتیویتی برای کاربر قابل مشاهده باشد، فراخوانی می شود. اگر اکتیویتی به پیش زمینه آورده شود، متد بعدی آن onResume() است و اگر اکتیویتی از کاربر پنهان شود، متد بعدی آن onStop() است.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: خیر
متد بعدی آن: onResume() یا onStop()
onResume(): این متد دقیقا قبل از اینکه اکتیویتی بخواهد با کاربر تعاملش را اغاز کند، فراخوانی می شود. که در این نقطه اکتیویتی در بالای پشته ی اکتیویتی قرار دارد.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: خیر
متد بعدی آن: onPause()
onPause(): این متد زمانی فراخوانی می شود که اکتیویتی دیگری می خواهد اجرا شود. اگر اکتیویتی بخواهد مجددا به نمایش در آید، متد بعد از این onResume() فراخوانی می شود و اگر بخواهد از دید کاربر پنهان شود، متد بعدی onStop() فراخوانی می شود.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: بله
متد بعدی آن: onResume() یا onStop()
onStop(): زمانی اجرا می شود که اکتیویتی دیگر در دسترس کاربر نیست و برای کاربر قابل مشاهده نباشد زیرا اکتیویتی دیگری از سر گرفته است و آن را پوشش می دهد. این ممکن است اتفاق افتد زیرا اکتیویتی دیگری شروع شده است یا اکتیویتی دیگری کارش را از سر گرفته است. اگر اکتیویتی می خواهد برگردد تا در دسترس کاربر قرار گیرد، متد بعد از آن onRestart() است و اگر بخواهد اکتیویتی کشته شود، متد بعدی onDestroy() است.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: بله
متد بعدی آن: onRestart() یا onDestroy()
onDestroy(): این متد آخرین فراخوانی است که اکتیویتی دریافت خواهد کرد. به عبارتی قبل از اینکه اکتیویتی شما نابود شود، این آخرین فراخوانی است که شما دریافت می کنید. این فراخوانی ممکن است به این دلیل باشد که اکتیویتی به پایان انجام وظیفه اش رسیده است (یعنی کسی متد finish() را اجرا کرده است) ، یا سیستم برای در اختیار گرفتن فضای بیشتر نیاز دارد تا بعشی از اکتیویتی ها را نابود کند. شما می توانید برای تمایز بین این دو حالت از متد isFinishing() استفاده کنید، که در تشخیص اینکه آیا متد واقعا تمام شده یا سیستم آنرا کشته است کمک می کند. متد isFinishing() اغلب داخل متد onPause() برای تعیین اینکه آیا اکتیویتی در حال pause() است یا نابود شده، استفاده می شود.
قابل کشته شدن(از بین رفتن یا kill شدن) بعد از اجرا: بله
متد بعدی آن: هیچ متد
نتیجه ی این بحث این است که مهمترین متد برنامه ها متد onCreate() است و در برنامه هایی که نوشته می شود حداقل باید کد مربوط به متد های onPause() ، onResume() و onCreate() را بنویسید.
متد هایی که به بخش قابل کشته شدن بعد از اجرا پاسخ خیر را داده اند، در مقابل نابود شدن توسط سیستم حفاظت شده اند. بنابراین زمانیکه اکتیویتی به متد onPause() پاسخ می دهد و نابود نمی شود، حتما به متد onResume() برخواهدگشت و دیگر این متد قابل نابود شدن نیست تا زمانیکه مجددا متد onPause() فراخوانی شود.
شناخت تغییرات پیکربندی
آخرین نکته در مورد چرخه ی حیات را می گوییم و سپس می توانید کدنویسی را شروع کنید. یک تغییر پیکربندی مانند یک تغییر در جهت گیری در صفحه نمایش(کاربر در حال حرکت روی صفحه نمایش به کنار و عقب، و portrait به landscape و غیره)، زبان، دستگاههای ورودی و غیره تعریف شده است. هنگامیکه یک تغییر پیکربندی اتفاق می افتد، باعث می شود که اکتیویتی خودبخود نابود شود، از طریق مسیر: onPause()➪onStop()➪onDestroy() . بعد از متد onDestroy() ، سیستم یک نمونه از اکتیویتی ایجاد می کند. زیرا ممکن است منابع، فایلهای layout و غیره بسته به پیکربندی سیستم جاری نیاز به تغییر داشته باشند. چرخه ی حیات یک موضوع پیچیده و وسیع است. من اصول اولیه ی را به شما معرفی کرده ام تا شما اپلیکیشن های این سری آموزش را درک کنید. به شدت توصیه می کنم که بعد از خواندن این سری آموزش، مستندات مربوط به چرخه ی حیات اکتیویتی(Activity Life Cycle) و چرخه ی حیات پردازش(Process Life Cycle) را در مستندات اندروید واقع در آدرس http://d.android.com/reference/android/app/Activity.html#ProcessLifecycle مطالعه کنید.
اطلاعات بیشتر درباره ی چرخه ی حیات اکتیویتی را می توانید در آدرس زیر بیابید:
http://d.android.com/reference/android/app/Activity.html#ActivityLifecycle.
استفاده از مطالب این مقاله با ذکر منبع راسخون بلامانع می باشد.
/ج