مقدمه ای بر چرخه ی حیات در اندروید

چاپ

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

 همچنین در فصل 4 آموختیم که اندروید، قبل از اینکه اپلیکیشن ما شروع به کار کند، متدی به نام onCreate را مورد فراخوانی قرار می دهد و اجرا می کند. اگر به خاطر داشته باشید، در فصل 2 این موضوع را در logcat مشاهده کردیم و همچنین با استفاده از کلاس Toast یک پیغام را به کاربر نشان دادیم. چیزی که اکنون می خواهیم مورد بررسی قرار دهیم این است که، در چرخه ی حیات اپلیکیشن هایی که می نویسیم چه اتفاقاتی رخ می دهد. بعنوان مثال می خواهیم بدانیم که هنگام شروع یک اپلیکیشن و هنگام پایان یافتن آن، و بین این دو، چه اتفاقاتی رخ می دهند. همچنین می خواهیم بدانیم که اندروید در مواقع مختلف، چگونه با اپلیکیشن ما تعامل می کند. 

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

سوال: آیا تا به حال متوجه شده اید که چرا در داخل متد onCreate کدهایی مثل زیر وجود دارند؟

مثال(چرخه ی حیات در اندروید)

 @Override 

درواقع وقتی که ما متد onCreate, را فراخوانی می کنیم، با استفاده از دستور بالا، از اندروید می خواهیم که این کدها را بازنویسی کند. اکنون به اولین خط از کدها در داخل متد onCreate دقت کنید:

مثال(چرخه ی حیات در اندروید)

 super.onCreate(savedInstanceState) 

این دستور به اندروید می گوید که قبل از بازنویسی و اجرای کدهای ما، ابتدا نسخه ی اصلی متد onCreate را اجرا کن. 
نکته: در کل، به این روش overriding یا بازنویسی کدها روی کدهای اصلی، گفته می شود. 

 متدهای زیاد دیگری نیز وجود دارند که می توانیم آنها را بازنویسی(override) کنیم. این متدها به ما کمک می کنند تا کدهای خود را به دفعات در داخل چرخه ی حیات اپلیکیشن خود اضافه کنیم. 

 دلیل اهمیت داشتن این متدها، که اندروید به هنگام نیاز آنها را فراخوانی می کند، این است که آنها زندگی و مرگ کدهای ما را کنترل می کنند. بعنوان مثال،  اگر در دستگاه اندرویدی خود در حال تایپ کردن یک یادداشت باشید، و کسی با شما تماس بگیرد،آیا اپلیکیشن شماکه در آن یادداشت می کنید، ناپدید خواهد شد و داده ها از بین خواهند رفت؟ (بعدا پاسخ داده خواهد شد).

 بنابراین  ما نیاز داریم تا بدانیم که متدهای اندروید، کی و چگونه و چرا فراخوانی شده و مورد استفاده قرا ر می گیرند. همه ی این موارد اهمیت چرخه ی حیات در اندروید را نشان می دهند. پس از آن باید بدانیم که چه زمانی و در کجا متدها را بازنویسی(override) کنیم تا به وسیله ی آن بتوانیم کدهای دلخواه خود را اضافه کنیم. 

 ابتدا اجازه دهید تا چرخه ی حیات اندروید را مورد آزمایش قرار دهیم سپس خواهیم فهمید که کدهای خود را در کجا قرار دهیم. 

 


مراحل چرخه ی حیات در اندروید(آنچه باید بدانیم)

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

هر اپلیکیشن در دستگاه های اندرویدی در یکی از حالت های(phase) زیر قرار دارد:

 بعنوان مثال وقتی که کاربر بر روی آیکن اپلیکیشن فیس بوک کلیک می کند، اپلیکیشن ابتدا ایجاد می شود(Being created). سپس اپلیکیشن شروع به کار می کند(Starting). توجه کنید که مراحل بالا کاملا پشت سر هم اتفاق نخواهند افتاد. اما فرض می کنیم که در یک اپلیکیشن چنین روندی طی شده باشد. بنابراین فرض می کنیم که اکنون اپلیکیشن ما از سر گیری شود(Resuming)، سپس  در حال اجرا(Running) قرار گیرد. در این مرحله، میزان مموری و پردازنده ی زیادی به برنامه داده می شود. اما اگر در این حین بخواهیم به جای اپلیکیشن فیس بوک از اپلیکیشن ایمیل استفاده کنیم چه خواهد شد؟ 

وقتی که به اپلیکیشن ایمیل خود می رویم، اپلیکیشن فیس بوک ابتدا به حالت توقف موقت(Pausing) در می آید و به دنبال آن به حالت توقف(Stopping) در خواهد آمد. سپس اپلیکیشن ایمیل در حالت ایجاد(Being created) قرار می گیرد و سپس به حالت از سر گیری(Resuming) در می آید و سپس به حالت اجرا(Running) در خواهد آمد. 
 حالا اگر بخواهیم دوباره از اپلیکیشن فیس بوک استفاده کنیم، این برنامه دیگر نیازی به حالتِ در حال ایجاد(Being created) ندارد و از سرگیری(Resuming) می شود و سپس اجرا(Running) می شود. 

 توجه کنید که اندروید در هر زمانی قادر است تا اپلیکیشن را stop کند و یا destroy (نابود) نماید. در این صورت، هر وقت که دوباره بخواهیم اپلیکیشن را مجددا اجرا کنیم، این برنامه نیاز دارد تا از مراحل ابتدایی شروع به کار کند، یعنی ابتدا به حالت created برود و سپس به حالت Starting برود و ... . 


مراحل چرخه ی حیات در اندروید( آنچه که باید انجام دهیم)

زمانی که در حال نوشتن یک اپلیکیشن هستیم، چگونه قادر هستیم تا با پیچیدگی های آن تعامل کنیم؟

خوب است بدانید که، هنگامی که داشتیم اولین پروژه ی اندرویدی خود را ایجاد می کردیم، کدهایی که به طور اتوماتیک ایجاد شده بودند، اکثر کارها را انجام می دادند. همچنین فهمیدیم که چطور کدهای خود را بازنویسی کنیم تا بتوانیم کدهای دلخواه خود را به یک حالت(phase) اضافه کنیم. 


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


 در زیر، توضیح کوتاهی در مورد متدهای اندروید آورده شده است. اندروید این متدها را برای راحتی کار با حالت های(phase) چرخه ی حیات ارائه داده است:

  1. متد onCreate: این متد زمانی اجرا می شود که اکتیویتی مورد نظر در حال ایجاد باشد. 
    در این حالت، تمامی عناصر اپلیکیشن، مثل رابط کاربری و گرافیک ها و صداها به حالت آماده باش درمی آیند.
  2. متد onStart: این متد زمانی اجرا می شود که اپلیکیشن مورد نظر در حالت شروع به کار( starting) قرار بگیرد. 
  3. متد onResume: این متد پس از متد onStart اجرا می شود. همچنین اگر اکتیویتی ما از قبل در حالت توقف موقت(paused) باشد و سپس ازسرگرفته شود(resumed) این متد اجرا خواهد شد. 
    بعنوان مثال این رویداد هنگامی که اپلیکیشن ما توسط یک تماس تلفنی متوقف شود و سپس دوباره اجرا شود، رخ خواهد داد.
  4. متد onPause: این متد زمانی اجرا می شود که اپلیکیشن ما در حال توقف موقت باشد. در اینجا می توانیم داده های ذخیره نشده را ذخیره کنیم و سپس آنها را در متد onResume بارگذاری کنیم. 
    مثلا هنگامی که یک پیام جدا، در بالای اکتیویتی جاری نشان داده می شود، این اکتیویتی به حالت توقف موقت در می آید. همچنین زمانی که کاربر به یک اکتیویتی دیگر هدایت می شود، این متد اجرا می شود و اکتیویتی ما به حالت توقف موقت درمی آید. 
  5. متد onStop: این متد به حالت توقف(stopping) مربوط می شود. با استفاده از این متد، کارهایی که در متد onCreate انجام داده ایم را خنثی می کنیم. مثلا منابع سیستمی اختصاص داده شده و یا اطلاعات ذخیره شده در دیتابیس را باطل می کنیم. 
  6. متد onDestroy: این متد در آخر کار و  به هنگام نابود شدن اکتیویتی رخ می دهد. در این حالت(phase) هیچ راه برگشتی وجود ندارد. 

 

 در اینجا یک سوال برای ما ایجاد می شود و آن این است: پس تکلیف حالت در حال اجرا(Running) چه می شود؟ 

پاسخ: همان طور که در آینده به هنگام نوشتن متدها(حالت ها) مشاهده خواهید نمود، متدهای onCreate و onStart و onResume اپلیکیشن ما را آماده می کنند و سپس حالت running را تشکیل داده و به آن ادامه می دهند. سپس متدهای onPause و onStop و onDestroy پس از آن اجرا می شوند. با این توضیحات، اکنون می توانیم در عمل نحوه ی کارکرد این متدها را مشاهده کنیم. برای انجام این کار، قصد داریم این متدها را بازنویسی(overriding) کنیم و سپس با استفاده از یک پیغام Log و یک پیغام Toast نتیجه را به شما نشان دهیم.