وقتی در برنامه اندروید، از یک Activity ، وارد Activity دیگر می شویم، چه اتفاقی برای Activity قبلی می افتد ؟
یکی از اصول اولیه برنامه های اندروید این است که ما از یک Activity به Activity دیگر وارد می شویم و هر بار با یک Activity سر و کار داریم. مثلا در یک Activity ، یک عنصر دکمه (Button) قرار می دهیم که با اشاره کاربر بر روی آن، به یک Activity دیگر وارد شویم. اما در این حالت، چه اتفاقی برای Activity قبلی که دیگر آن را نمی بینیم می افتد ؟ این را می دانیم که در اکثر مواقع (در ادامه متوجه می شوید که چرا نمی گوییم همیشه)، با اشاره بر روی دکمه Back گوشی، به آن Activity قبلی برمی گردیم، اما در ادامه دلیل آن و چگونگی انجام آن را شرح خواهیم داد.
ابتدا بگذارید نگاهی به چرخه یک Activity بیندازیم :
ما معمولا کدهای یک Activity را مشابه کدهای زیر می نویسیم (ساده ترین کد برای ساخت یک Activity) :
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
// your codes
}
}
همان طور که مشاهده می کنید، در ساده ترین شکل ممکن برای کدهای یک Activity ، تنها روش onCreate را داریم. در واقع با رفتن به یک Activity ، این روش onCreate است که اجرا می شود. بنابراین رابط گرافیکی متناظر با Activity به کاربر نمایش داده می شود و از این به بعد، اینکه چه کدی اجرا شود، بستگی به انتخاب های کاربر دارد. بنابراین کاربر انتخاب هایی مثل گزینه های موجود در خود رابط گرافیکی Activity و همچنین فشار دادن دکمه های گوشی را دارد.
فرض کنیم که در رابط گرافیکی Activity ، یک دکمه باشد که با اشاره کاربر بر روی آن، به یک Activity دیگر وارد شویم، اما برای این Activity چه اتفاقی می افتد ؟
با رفتن به یک Activity جدید، این Activity به حالت توقف موقتی (pause) یا حالت توقف کامل (stop) در می آید.
تفاوت بین دو حالت توقف موقتی (pause) و حالت توقف کامل (stop) :
اگر با شروع Activity جدید، بتوانیم بخشی از Activity قبلی را ببینیم، Activity قبلی در حالت pause قرار گرفته است، اما اگر نتوانیم بخشی از آن را ببینیم، Activity قبلی در حالت stop قرار گرفته است.
تعیین یک سری کد برای اجرا شدن در هنگام وقوع یکی از دو حالت توقف موقتی (pause) و حالت توقف کامل (stop) :
برای هر یک از دو حالت pause یا stop ، روش هایی (methods) در نظر گرفته شده است که با نوشتن کدهای آنها در میان کدهای Activity ، می توانیم تعیین کنیم که با وقوع هر یک از این دو حالت، یک سری کد اجرا شود. به عنوان مثال، برای حالت pause ، یک روش (method) با نام onPause در نظر گرفته شده است، یعنی اینکه با پیش آمدن حالت pause برای Activity ، کدهای موجود در این روش اجرا خواهند شد. روش onPause ، کدهایی مشابه کد زیر خواهد داشت :
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
// your codes for pause
}
و محل قرارگیری آن در میان کل کدهای Activity ، به صورت زیر می باشد :
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
// your codes
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
// your codes for pause
}
}
اما به کار بردن روش onPause اختیاری است و تنها آن را در صورتی به کار می بریم که بخواهیم هنگام pause شدن Activity ، یک سری کد اجرا شود. بنابراین بر اساس اینکه روش onPause در کدهای Activity نوشته شده باشد یا نه، دو حالت داریم که آنها را در ادامه شرح می دهیم :
حالت اول : روش onPause در Activity نوشته نشده باشد :
چنانچه در کدهای Activity ، روش onPause نوشته نشده باشد، بنابراین Activity به حالت pause می رود، به این صورت که دیگر قابل تعامل برای کاربر نیست و یک Activity در پس زمینه (background activity) می باشد. بنابراین عملیات های آن متوقف می شود تا حافظه (memory) به Activity فعلی (foreground activity) که در حال کار کردن با آن هستیم، اختصاص یابد.
زمانی که دوباره به آن Activity که یک Activity در پس زمینه (background activity) است، برمی گردیم (مثلا با اشاره بر روی دکمه Back گوشی)، عملیات resume برای Activity اجرا خواهد شد (نه عملیات create ، یعنی Activity از ابتدا اجرا نمی شود، بلکه ادامه اجرای کدهای آن را خواهیم داشت). اگر به عکس مربوط به چرخه Activity نگاهی بیندازید، مشاهده می کنید که یک روش هم با نام onResume برای عملیات resume پیش بینی شده است که می توانید کدهای مورد نظر خود را در آن بنویسید، ولی بیشتر به این نکته توجه داشته باشید که resume شدن، باعث اجرای دوباره روش onReume می شود، نه اجرای دوباره روش های onCreate و onStart .
دقت شود که چون روش onResume اجرا می شود، بنابراین باید ببینیم که اصلا کدی برای روش onResume در میان کدهای Activity نوشته شده است یا خیر. اگر کدی وجود داشته باشد، هنگام resume شدن Activity ، اجرا می شوند، اما اگر کدی وجود نداشته باشد، تنها همان حالت قبلی Activity و ادامه اجرای کدهای آن را خواهیم داشت.
حالت دوم : روش onPause در Activity نوشته شده باشد :
ابتدا کدهایی که در روش onPause از کدهای Activity نوشته ایم اجرا خواهد شد، سپس همان عملیات های مربوط به حالت اول که بیان کردیم، اجرا می شود (همان عملیات ها اجرا می شود).
دو حالتی که برای عملیات pause ذکر کردیم، برای عملیات stop نیز به همین صورت خواهد بود (مشابه هستند)، با این تفاوت که به جای اجرای روش onPause ، اجرای روش onStop را خواهیم داشت و همچنین در صورت بازگشت به Activity ، روش هایی که در شکل زیر با فلش نمایش داده ایم، اجرا خواهند شد :
از دست رفتن وضعیت قبلی Activity قرار گرفته در حالت pause و یا حالت stop ، به دلیل کمبود حافظه (memory) گوشی :
گاهی اوقات که گوشی اندروید، از نظر حافظه (memory)، برای اجرای برنامه های با اولویت بالاتر، با مشکل روبرو می شود (حافظه کم می آورد)، آن Activity ای که می خواهد در یکی از دو حالت pause یا stop قرار بگیرد را به طور کامل می بندد (پردازش کل برنامه متوقف می شود)، به گونه ای که با رجوع بعدی کاربر به آن Activity ، از اول اجرا خواهد شد (یعنی شروع با اجرای روش onCreate و ادامه همان روند عادی). بنابراین در این حالت، وضعیت قبلی Activity از دست می رود. این مورد را در شکل زیر (شکل چرخه Activity) با دو علامت در کنار روش های onPause و onStop مشخص کرده ایم :
در واقع، پس از اجرای روش onPause یا روش onStop ، اگر گوشی، حافظه را برای برنامه های با اولویت بالاتر نیاز داشته باشد، آن Activity را به طور کامل خواهد بست (پردازش کل برنامه متوقف می شود) و Activity در یکی از آن دو حالت pause یا stop قرار نمی گیرد.
مواردی که خودمان تعیین می کنیم که به آن Activity قبلی بازنگردیم :
گاهی اوقات نیز خودمان تعیین می کنیم که اگر از این Activity به Activity دیگری منتقل شدیم، دیگر کاربر نتواند به این Activity بازگردد. برخی از موارد مربوط به آن را ذکر می کنیم (فرض می کنیم که به حالت pause رفته است و مواردی که گفته می شود، برای حالت stop نیز مشابه است و تنها باید روش های مربوط به حالت stop و نکات آن را در نظر بگیرید) :
* در میان کدهای روش onPause در Activity قبلی، با یک سری کد، تعیین می کنیم که Activity قبلی به طور کامل بسته شود (یعنی destroy شدن Activity).
* در Activity بعدی، یک سری کد می نویسیم که عملکرد دکمه Back گوشی را در آن Activity تغییر بدهد، یعنی با اشاره کاربر بر روی دکمه Back گوشی، دیگر به Activity قبلی باز نمی گردیم، بلکه یک سری کد که خود کاربر تعیین کرده است، اجرا خواهد شد.