چرخه حیات اندروید
فهرست مطالب
آخرین به روزرسانی در 29/07/2022
در این مقاله قصد داریم به بررسی یکی از مهم ترین مباحث اندروید
یعنی Activity Lifecycle یا به اصطلاح چرخه حیات بپردازیم.
این مقاله یکی دیگر از مقالات آموزشی اندروید می باشد که به بررسی کامل
این مبحث و جزئیات کدینگ آن و همچنین مباحث تئوریک و عملی برای ایجاد بهترین
تعامل بین اپلیکیشن با کاربر می پردازد.
چرخه حیات چیست ؟
چرخه حیات اندروید به توسعه دهندگان کمک می کند تا متوجه شوند هنگام حرکت و تعامل کاربر در یک برنامه، فعالیت ها و عملکردهای برنامه در کدام حالت ها انجام می شود.
یک برنامه اندروید دارای چرخه حیات است. از زمانی که کاربر برنامه را باز می کند تا زمانیکه از آن خارج می شود، مراحل مختلفی را طی می کند.
این چرخه شامل موارد زیر می باشد :
- باز کردن برنامه
- مکث برای اجرای آن
- اجرا و ادامه ی آن
- توقف
- بستن برنامه
با دانستن تخصصی مراحل چرخه ی حیات اپلیکیشن شما می تواند در هر مرحله بهترین پاسخ را به کاربران بدهد.
مراحل چرخه حیات
یک چرخه حیات اندروید از شش مرحله اصلی عبور می کند ، که عبارتند از:
- ()onCreate
- ()onStart
- ()onResume
- ()onPause
- ()onStop
- ()onDestroy
سیستم هر یک از این فراخوان ها را با وارد شدن یک فعالیت به حالت جدید می خواند.
توجه داشته باشید که لازم نیست همه این فراخوان های چرخه حیات را در برنامه اندروید خود پیادهسازی کنید.
به عنوان یک توسعه دهنده، باید بدانید که بسته به پیچیدگی فعالیت، هر یک از این فراخوان ها را چه زمانی اجرا کنید.
در اینجا یک نمودار ساده آمده است که نحوه تعامل کاربران با چرخه حیات فعالیت را نشان می دهد.
()onCreate
پاسخ به فراخوان () onCreate در همه برنامه های اندروید اجباری است.
این اولین روشی است که وقتی یک فعالیت را از صفحه اصلی یا intent راه اندازی می کنیم، فراخوانی می شود.
به عبارت دیگر، این یک callback پیش فرض است که هنگام ایجاد یک فعالیت جدید به طور خودکار ایجاد می شود.
این تنها روشی است که توسعهدهندگان برای پیادهسازی منطق اکتیویتی نیاز دارند که فقط یک بار اتفاق میافتد، مانند مقداردهی اولیه ViewModel
اندروید استادیو به طور خودکار کلاسی به نام فایل MainActivity.java ایجاد می کند.
این کلاس حاوی یک () onCreate است که زمانی که کاربر برای اولین بار برنامه را باز می کند، فراخوانی می شود.
هنگامی که کاربر برنامه را باز می کند، چرخه حیات شروع می شود.
در مرحله ی اول () onCreate بلافاصله فراخوانی می شود تا برنامه را باز کند که ممکن است شامل اجزایی مانند UI باشد.
در اینجا یک کد نمونه قرار داده شده است که نحوه پیاده سازی متد () onCreate را نشان می دهد.
ما در این کد یک Log و یک Toast اضافه کرده ایم که بعداً در این راهنما از آنها برای خواندن وضعیتهای فعالیت استفاده خواهیم کرد.
در MainActivity.java، مطمئن شوید که متد () onCreate دارای خطوط زیر برای چاپ پیام Toast و Log باشد.
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "onCreate MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onCreate MainActivity");
}
در این مرحله فعالیت و برنامه ی شما هنوز قابل مشاهده نیست.
تا زمانی که تابع () onCreate تمام شود در این حالت باقی می ماند، سپس به سرعت به حالت بعدی می رود.
() onStart
هنگامی که یک برنامه راه اندازی می شود، سیستم یک متد () onStart را فراخوانی می کند.
این فراخوانی برای قابل مشاهده کردن فعالیت برای کاربر فراخوانی می شود.
در اینجا نحوه پیاده سازی () onStart به صورت کامل آمده است.
@Override
protected void onStart() {
Toast.makeText(this, "onStart MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStart MainActivity");
super.onStart();
}
() onStart را می توان چندین بار در طول چرخه حیات برنامه فراخوانی کرد.
به عنوان مثال، این روش را می توان زمانی فراخوانی کرد که کاربر یک عملیات دیگر را اجرا کند و سپس به فعالیت قبلی بازگردد.
در طول چرخه حیات فعالیت، تابع () onStop فراخوانی می شود.
این بدان معنی است که برخی از منابع درحافظه ی موقت آزاد می شوند.
متد () onStart را می توان برای مقداردهی اولیه چنین منابعی فراخوانی کرد.
() onResume
پس از فراخوانی () onStart حال نوبت به فراخوانی () onResume می رسد.
این فعالیت و متد حالت تعاملی را با کاربر دارد به اینصورت که کاربر در پی انجام هر
عملیاتی بلافاصله پاسخ دریافت کرده و در واقع چرخه به حرکت خود ادامه می دهد.
@Override
protected void onResume() {
Toast.makeText(this, "onResume MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResume MainActivity");
super.onResume();
}
در این مرحله چرخه به حرکت خود ادامه می دهد مگر اینکه اتفاقی در بین اجرا بیوفتند که این اتفاق
ممکن است شامل تعامل بیش از حد (حالت چند پنجره ای) از سایر برنامه ها مانند تماس تلفنی یا زمانی که کاربر به فعالیت دیگری می رود باشد.
()onPause
() onPause زمانی فراخوانی می شود که کاربر به یک فعالیت یا عملکرد دیگر یا حتی به یک برنامه ی دیگر در پنجره های حالت باز سوییچ کند.
در این مرحله، فعالیت و در بک گراند اجرا میشود.
این تماس برگشتی فعالیت را متوقف کرده و برخی از منابعی را که این فعالیت مصرف میکرد آزاد میکند.
همچنین همه ی عملیات های غیر ضروری متوقف می شوند.
@Override
protected void onPause() {
Toast.makeText(this, "onPause MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onPause MainActivity");
super.onPause();
}
هنگامی که () onPause فراخوانی می شود ، ممکن است برخی منابع را از حافظه آزاد کند.
با این حال، مطمئن شوید که آنها را مجدداً در طول فراخوانی ()onResume مقداردهی کنید.
() onPause یک فراخوان کوتاه است که همانطورکه گفته شد امکان انتقال به فعالیت های دیگر را فراهم می کند.
بنابراین، محاسبات فشرده نباید در این مرحله اجرا شود.
این ممکن است برنامه را از انتقال به سایر فعالیتها و عملکردها به تاخیر بیندازد و در نتیجه منجر به تجربه کاربری ضعیف شود.
() onStop
در این مرحله، اکثر فرآیندهای فعالیت و عملکردی متوقف شده است. با این حال، فعالیت همچنان در بک گراند کارس اجرا میشود.
این چرخه حیات معمولاً پس از اجرای متد () onPause به دلیل تغییر کاربر به سایر فعالیتها یا فشار دادن دکمه خانه اتفاق میافتد.
این فرخوان در واقع برای آزادسازی منابع سنگین و توقف عملیات فشرده استفاده می شود.
از آنجایی که () onPause مختصر و موقت است، در عوض () onStop می تواند برای ذخیره داده ها در کانال های دیگر مانند پایگاه های داده استفاده شود.
@Override
protected void onStop() {
Toast.makeText(this, "onStop MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStop MainActivity");
super.onStop();
}
توجه: در حال حاضر در این نمونه کد فعالیت ها به صورت کامل متوقف نشده اند و
نمونه های فعالیت در یک پشته ذخیره می شوند. این بدان معنی است که همه موارد ذکر شده، از جمله نماها، هنوز فعال هستند.
وقتی کاربر دوباره آن را باز می کند، برنامه همه نمونه ها را دوباره بارگیری نمی کند.
در عوض، آنها را از حافظه بازیابی می کند. این شامل اجزای UI مانند TextViews نیز می شود.
() onRestart
از آنجایی که حالت های اکتیویتی هنوز وجود دارد، متد () onRestart می تواند زمانی که کاربر فعالیت
را مجدداً راه اندازی می کند فراخوانی شود.
این بدان معناست که فعالیت به صفحه اصلی باز می گردد و کاربر می تواند تعامل با اجزای آن را از سر بگیرد.
همانطور که گفته شد، تابع () onCreate تنها یک بار در چرخه حیات یک فعالیت فراخوانی می شود.
بنابراین، زمانی که متد () onRestart اجرا میشود، فعالیت با اجرای () onStart سپس () onResume ادامه پیدا خواهد کرد.
@Override
protected void onRestart() {
Toast.makeText(this, "onRestart MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onRestart MainActivity");
super.onRestart();
}
()onDestroy
این فراخوان در واقع برای از بین بردن مجموعه ای از فعالیت ها و عملکردها مورد استفاده قرار می گیرد.
به عنوان مثال فرض کنید شما تنظیمات جدیدی را لحاظ کرده و مجدد سیستم را ری استارت می کنید در این حالت تنظیمات قبلی با فراخوانی این متد از بین رفته و تنظیمات جدید صدا زده خواهند شد.
@Override
protected void onDestroy() {
Toast.makeText(this, "onDestroy MainActivity", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onDestroy MainActivity");
super.onDestroy();
}
تست چرخه حیات
ما این برنامه را اجرا می کنیم و پیام های Logcat خود را می خوانیم تا ببینیم این روش های مختلف چگونه اجرا می شوند.
در این مرحله، MainActivity.java شما باید کد زیر را داشته باشد:
برای آزمایش برنامه، یک فعالیت دیگر اضافه می کنیم تا بتوانیم این روش ها را با تغییر از نقطه A به B بخوانیم.
در اندروید استودیو، یک اکتیویتی خالی دیگر ایجاد کنید و نام آن را Activity2.java بگذارید،
همان کد فایل MainActivity.java را اضافه می کنیم. با این حال، ما پیام های Toast و Log را مطابق شکل زیر تغییر می دهیم:
public class Activity2 extends AppCompatActivity {
private static final String TAG = "Activity2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
Toast.makeText(this, "onCreate Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onCreate Activity2");
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, "onStart Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStart Activity2");
}
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(this, "onRestart Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onRestart Activity2");
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "onResume Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResume Activity2");
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "onPause Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onPause Activity2");
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(this, "onStop Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStop Activity2");
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(this, "onDestroy Activity2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onDestroy Activity2");
}
}
در MainActivity خود، روش زیر را اضافه کنید تا به ما کمک کنید بین فعالیتها حرکت کنیم:
public void gotoActivity2(View view) {
Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
}
هدف بالا به ما در اجرا و پیمایش به Activity2 کمک می کند.
برای اجرای این متد، همانطور که در زیر مشخص شده است، یک دکمه در activity_main.xml اضافه می کنیم:
این برنامه باید در دستگاه اندروید شما به این شکل باشد :
بلافاصله پس از راه اندازی برنامه، روش های زیر به صورت متوالی اجرا می شوند :
برنامه با اجرای تابع () onCreate شروع می شود. در این مرحله، اجزای برنامه هنوز قابل مشاهده نیستند.
سپس متد () onStart و به دنبال آن () onResume فراخوانی می شود. در این چرخه حیات، کاربر می تواند با اجزای UI تعامل داشته باشد.
حالا بیایید با کلیک روی دکمه go-to Activity2 به Activity2 برویم.
در این لحظه، Activity2 در حال مسدود کردن MainActivity است.
این بدان معناست که MainActivity با استفاده از پاسخ به تماس ()onPause متوقف خواهد شد. این مورد در زیر برجسته شده است :
توجه داشته باشید که MainActivity از بین نمی رود.
این بدان معناست که حالات آن در حافظه ذخیره می شود و ما می توانیم آنها را بازیابی کنیم.
برای انجام این کار، به فعالیت قبلی برگردید و پیام های Logcat را تماشا کنید.
همانطور که می بینید، سه متد در اینجا اجرا می شود: () onRestart ()، onStart و () onResume.
وقتی back را صدا میزنید ، به این معنی است که از فعالیت خارج میشوید و تماسهای برگشتی مطابق شکل زیر اجرا میشوند:
همانطور که می بینید، هنگام خروج از برنامه،() onDestroy ابتدا فراخوانی نمی شود. این فعالیت همچنان چرخه حیات خود را دنبال می کند.
نتیجه گیری
بهعنوان یک توسعهدهنده، باید عاقلانه تصمیم بگیرید که وقتی یک متد خاص یا callback اجرا میشود،
چه چیزی را اجرا کنید. ممکن است در نهایت از همه این تماس ها در یک برنامه استفاده نکنید.
این آموزش به شما کمک کرده تا مراحل مختلف چرخه حیات را در یک برنامه اندرویدی یاد بگیرید.
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
در زندگی رویاهات را دنبال کن