برنامه‌نویسی اندروید

چرخه حیاط اکتیویتی (lifecycle) در اندروید

چرخه حیاط اکتیویتی (lifecycle) در اندروید

در سیستم‌عامل اندروید هر صفحه یا فعالیتی که کاربر مشاهده می‌کند، در قالب Activity اجرا می‌شود. اما فعالیت‌ها صرفاً نمایش داده نمی‌شوند؛ بلکه یک چرخه حیاط مشخص دارند که شامل زمان ایجاد، اجرا، توقف، بازگشت و نابودی است.

درک صحیح Lifecycle اکتیویتی یکی از مهم‌ترین مباحث در برنامه‌نویسی اندروید است؛ زیرا عدم مدیریت درست آن می‌تواند باعث مشکلاتی مثل:

  • مصرف بیش از حد باتری
  • کاهش Performance
  • کرش کردن برنامه
  • نشت حافظه (Memory Leak)

در این مقاله کاملاً یاد می‌گیرید چرخه حیاط اکتیویتی چیست، چرا مهم است و چگونه باید آن را مدیریت کنیم.

چرخه حیاط اکتیویتی در اندروید

در اندروید، زمانی که یک اکتیویتی جدید اجرا می‌شود و اکتیویتی قبلی متوقف می‌شود، این تغییرات از طریق متدهای پاسخگویی چرخه حیاط اکتیویتی (Activity Lifecycle Callback Methods) مدیریت می‌شوند.

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

  • ایجاد اکتیویتی (Creating Activity): زمانی که اکتیویتی برای اولین بار ایجاد می‌شود.
  • متوقف شدن اکتیویتی (Stopping Activity): هنگامی که اکتیویتی به پس‌زمینه می‌رود و فعالیت آن متوقف می‌شود.
  • از سرگیری اکتیویتی (Resuming Activity): زمانی که اکتیویتی دوباره فعال شده و پردازش آن از سر گرفته می‌شود.
  • از بین رفتن اکتیویتی (Destroying Activity): هنگامی که اکتیویتی به‌طور کامل از حافظه خارج شده و دیگر قابل استفاده نیست.

هر یک از این متدها فرصتی را برای اجرای عملیات خاصی متناسب با وضعیت سیستم فراهم می‌کنند. به عنوان مثال:

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

برای نصب و راه اندازی ابزارهای برنامه نویسی اندروید با جزئیات بیشتر آموزش نصب و راه اندازی اندروید به مقاله ما مراجعه کنید.

اهمیت و مزایای یادگیری چرخه حیاط

شناخت Lifecycle فقط یک مفهوم تئوری نیست؛ بلکه پایه بسیاری از بخش‌های اندروید است. با یادگیری آن می‌توانید:

  •  مدیریت درست منابع (باتری، رم، CPU)
  • جلوگیری از Memory Leak
  • ذخیره اطلاعات هنگام چرخش صفحه یا خروج کاربر
  • اجرای درست سرویس‌ها و درخواست‌های شبکه
  • ساخت اپلیکیشن‌های حرفه‌ای‌تر و پایدارتر
  • کنترل رفتار برنامه هنگام Call، SMS یا Notification

پس برنامه‌نویسان حرفه‌ای اندروید همیشه چرخه حیاط را مدیریت می‌کنند.

نمای کلی چرخه حیاط اکتیویتی در اندروید

1
2
onCreate() → onStart() → onResume() → (Activity is running)
onPause() → onStop() → onDestroy()

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

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

اهمیت و مزایای یادگیری چرخه حیات

شناخت Lifecycle فقط یک مفهوم تئوری نیست؛ بلکه پایه بسیاری از بخش‌های اندروید است. با یادگیری آن می‌توانید:

  •  مدیریت درست منابع (باتری، رم، CPU)
  • جلوگیری از Memory Leak
  • ذخیره اطلاعات هنگام چرخش صفحه یا خروج کاربر
  • اجرای درست سرویس‌ها و درخواست‌های شبکه
  • ساخت اپلیکیشن‌های حرفه‌ای‌تر و پایدارتر
  • کنترل رفتار برنامه هنگام Call، SMS یا Notification

پس برنامه‌نویسان حرفه‌ای اندروید همیشه چرخه حیات را مدیریت می‌کنند.

مراحل چرخه حیاط اکتیویتی و متدهای کلیدی آن

  1. onCreate() – زمانی که اکتیویتی برای اولین بار ایجاد می‌شود، این متد فراخوانی شده و در آن باید عملیات اولیه مانند ایجاد رابط کاربری، مقداردهی اولیه متغیرها، و تنظیمات مورد نیاز انجام شود.
  2. onStart() – این متد زمانی اجرا می‌شود که اکتیویتی به کاربر نمایش داده می‌شود، اما هنوز تعامل مستقیمی با او ندارد.
  3. onResume() – زمانی که اکتیویتی فعال می‌شود و کاربر مستقیماً با آن تعامل دارد، این متد اجرا شده و عملیات‌هایی مانند پخش ویدیو، دریافت داده زنده یا فعال کردن سنسورها در این مرحله انجام می‌شود.
  4. onPause() – هنگامی که اکتیویتی در حال متوقف شدن است (مثلاً کاربر برنامه را ترک می‌کند یا تماس دریافت می‌شود)، این متد اجرا شده و باید منابعی مانند دوربین، سنسورها و شبکه آزاد شوند.
  5. onStop() – زمانی که اکتیویتی دیگر به کاربر نمایش داده نمی‌شود (مثلاً برنامه به پس‌زمینه می‌رود)، این متد فراخوانی شده و معمولاً در این مرحله باید ذخیره‌سازی داده‌ها و آزاد کردن منابع سنگین انجام شود.
  6. onDestroy() – قبل از اینکه اکتیویتی به‌طور کامل از بین برود، این متد اجرا می‌شود و معمولاً برای پاک‌سازی نهایی و جلوگیری از نشت حافظه استفاده می‌شود.
  7. onRestart() – هنگامی که یک اکتیویتی که متوقف شده بود، مجدداً شروع به کار کند، این متد فراخوانی شده و باعث بازگرداندن منابع و داده‌های ذخیره‌شده می‌شود.

چرا مدیریت صحیح چرخه حیاlifecycle اکتیویتی مهم است؟

  •  جلوگیری از کرش‌های ناگهانی هنگام دریافت تماس یا تغییر برنامه
  • بهینه‌سازی مصرف منابع مانند پردازنده، باتری و حافظه
  • حفظ تجربه کاربری روان و بدون اختلال
  • جلوگیری از از دست رفتن داده‌های کاربر هنگام تغییر وضعیت اپلیکیشن
چرخه حیات lifecycle اکتیویتی در اندروید
چرخه حیاط lifecycle اکتیویتی در اندروید

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

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

Lifecycle callbacks:

متد () onCreate :

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

1
2
3
4
5
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    Log.d("Lifecycle", "onCreate called")
}

متد () onStart :

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

متد () onResume :

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

1
2
3
4
override fun onResume() {
    super.onResume()
    Log.d("Lifecycle", "onResume called")
}

متد () onPause :

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

1
2
3
4
override fun onPause() {
    super.onPause()
    Log.d("Lifecycle", "onPause called")
}

متد () onStop :

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

1
2
3
4
override fun onStop() {
    super.onStop()
    Log.d("Lifecycle", "onStop called")
}

متد () onDestroy :

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

ایجاد پروژه در اندروید استودیو
خواندن این مقاله

وقتی اکتیویتی کاملاً بسته می‌شود.

1
2
3
4
override fun onDestroy() {
    super.onDestroy()
    Log.d("Lifecycle", "onDestroy called")
}

چرخه حیات در اپلیکیشن‌های واقعی — چه زمانی کاربرد دارد؟

کاربرد مثال
ذخیره داده‌ها هنگام خروج کاربر فرم ثبت‌نام
توقف ویدیو هنگام رفتن به بک‌گراند MediaPlayer
لغو درخواست API هنگام خروج از صفحه Retrofit
ذخیره وضعیت UI هنگام Rotate شدن گوشی Orientation Change
آزاد کردن حافظه توقف Sensorها یا GPS

 

حرکت ما بین اکتیویتی ها:

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

شروع یک اکتیویتی

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

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

متد () startActivity :

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

1
2
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

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

1
2
3
4
5
Intent intent = new Intent(Intent.ACTION_SEND);
 
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
 
startActivity(intent);

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

چرخه حیات در اپلیکیشن‌های واقعی — چه زمانی کاربرد دارد؟

کاربرد مثال
ذخیره داده‌ها هنگام خروج کاربر فرم ثبت‌نام
توقف ویدیو هنگام رفتن به بک‌گراند MediaPlayer
لغو درخواست API هنگام خروج از صفحه Retrofit
ذخیره وضعیت UI هنگام Rotate شدن گوشی Orientation Change
آزاد کردن حافظه توقف Sensorها یا GPS

حفظ داده هنگام چرخش صفحه (Rotation)

1
2
3
4
5
6
7
8
9
override fun onSaveInstanceState(outState: Bundle) {
    outState.putString("name", userName)
    super.onSaveInstanceState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    userName = savedInstanceState.getString("name", "")
}

جمع‌بندی

  • هر Activity دارای چرخه حیات مشخص است.
  • یادگیری Lifecycle برای جلوگیری از Memory Leak ضروری است.
  • متدهای مهم: onCreateonResumeonPauseonStoponDestroy
  • باید در هر مرحله منابع را درست مدیریت کنیم.
  • برای ساخت اپلیکیشن حرفه‌ای، کنترل Lifecycle ۱۰۰٪ ضروری است.

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

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