چرخه زندگی یک برنامه موبایل تعیین میکند که برنامه در هنگام راهاندازی، کوچکسازی، بازگشت از پسزمینه و بسته شدن چگونه رفتار میکند. در این مقاله به بررسی App Lifecycle (iOS)، Activity Lifecycle (Android)، Fragment Lifecycle، ViewController Lifecycle و LifecycleOwner میپردازیم. درک این فرآیندها برای جلوگیری از نشت حافظه، از دست دادن داده و عملکرد نادرست برنامه بسیار مهم است. جزئیات بیشتر در مستندات رسمی Android Activity Lifecycle.
نکات کلیدی
قبل از پرداختن به چرخه زندگی صفحات جداگانه، درک چرخه زندگی کل برنامه مهم است. در iOS، برنامه از پنج حالت عبور میکند: Not Running (در حال اجرا نیست)، Inactive (در پسزمینه، رویدادها را دریافت نمیکند)، Active (فعال)، Background (در پسزمینه، کد در حال اجراست) و Suspended (در پسزمینه، کد متوقف شده). این حالتها در AppDelegate از طریق روشهای applicationDidFinishLaunching، applicationDidBecomeActive، applicationWillResignActive، applicationDidEnterBackground و applicationWillTerminate مدیریت میشوند.
در Android، معادل آن Application Lifecycle است که از طریق رابط Application.ActivityLifecycleCallbacks ردیابی میشود. با این حال، Android بیشتر بر چرخه زندگی یک Activity — یک صفحه برنامه جداگانه — تمرکز میکند.这是因为 یک برنامه Android میتواند از چندین Activity تشکیل شده باشد که هر کدام چرخه خاص خود را دارند.
رویکرد مدرن در Android استفاده از ProcessLifecycleOwner از کتابخانه lifecycle-process است. این امکان ردیابی وضعیت کل فرآیند را بدون وابستگی به یک Activity خاص فراهم میکند. در iOS، از UISceneDelegate (از iOS 13) یا AppDelegate برای ردیابی وضعیت برنامه استفاده میشود. SceneDelegate چندین پنجره (multiwindow) را در iPad مدیریت میکند. درک App Lifecycle برای IT Sectr هنگام توسعه برنامههای دارای همگامسازی پسزمینه، پخش جریانی و تماسهای VoIP بسیار مهم است.
Activity مؤلفه اصلی یک برنامه Android است که یک صفحه را نشان میدهد. Activity دارای چرخه زندگی مشخصی است که توسط سیستم عامل در پاسخ به اقدامات کاربر و رویدادهای سیستم (چرخش صفحه، تماس ورودی، کمبود حافظه) مدیریت میشود.
| روش | توضیحات | چه باید کرد |
|---|---|---|
| onCreate | یک بار هنگام ایجاد Activity فراخوانی میشود | راهاندازی UI، findViewById، تنظیم ViewModel |
| onStart | Activity قابل مشاهده میشود | شروع انیمیشنها، ثبت BroadCastReceiver |
| onResume | Activity فوکس ورودی را دریافت میکند | شروع دوربین، سنسورها، انیمیشنها |
| onPause | Activity فوکس را از دست میدهد (تا حدی قابل مشاهده) | ذخیره پیشنویسها، توقف انیمیشنها |
| onStop | Activity قابل مشاهده نیست | آزادسازی منابع، توقف بهروزرسانیها |
| onDestroy | Activity نابود میشود | پاکسازی همه ارجاعات، لغو اشتراک LiveData |
| onRestart | بعد از onStop و قبل از onStart فراخوانی میشود | راهاندازی مجدد |
مهم: onSaveInstanceState قبل از onStop برای ذخیره وضعیت موقت فراخوانی میشود. بازیابی در onCreate از طریق Bundle savedInstanceState یا از طریق SavedStateHandle در ViewModel انجام میشود. بدون مدیریت صحیح چرخه زندگی، برنامه در هنگام چرخش صفحه تمام دادههای ذخیره نشده را از دست میدهد.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
در Jetpack Compose، چرخه زندگی Activity بدون تغییر باقی میماند، اما Compose ابزارهای اضافی ارائه میدهد: ترکیب آگاه از چرخه زندگی از طریق LifecycleOwner، افکتهای LifecycleEventEffect و DisposableEffect برای پاکسازی خودکار منابع هنگام نابودی.
Fragment در Android در داخل Activity زندگی میکند و چرخه زندگی خاص خود را دارد که تا حدی با Activity همپوشانی دارد اما روشهای جدیدی اضافه میکند. Fragmentها میتوانند بدون نابود کردن Activity اضافه، جایگزین و حذف شوند که آنها را انعطافپذیرتر اما همچنین پیچیدهتر میکند.
روشهای کلیدی Fragment Lifecycle: onAttach — Fragment به Activity متصل شد (اولین فراخوانی)؛ onCreate — راهاندازی داده؛ onCreateView — ایجاد View؛ onViewCreated — View ایجاد شد، UI قابل پیکربندی است؛ onStart — Fragment قابل مشاهده؛ onResume — Fragment در فوکس؛ onPause — Fragment فوکس را از دست میدهد؛ onStop — Fragment قابل مشاهده نیست؛ onDestroyView — View نابود میشود؛ onDestroy — Fragment نابود میشود؛ onDetach — Fragment از Activity جدا میشود.
تفاوت کلیدی با Activity: onCreateView و onDestroyView میتوانند چندین بار فراخوانی شوند (مثلاً هنگام جابجایی TabLayout)، در حالی که onCreate یک بار فراخوانی میشود. بر این اساس، راهاندازی View باید در onViewCreated انجام شود، نه در onCreateView. منابع مربوط به View (مانند آداپتورهای RecyclerView) باید در onDestroyView پاکسازی شوند.
UIViewController کلاس پایه برای مدیریت صفحات در iOS است. چرخه زندگی آن شامل دنبالهای از روشهاست که UIKit به طور خودکار فراخوانی میکند. درک این چرخه برای راهاندازی صحیح UI، مدیریت داده و حافظه بسیار مهم است.
| روش | چه زمانی فراخوانی میشود | استفاده معمول |
|---|---|---|
| loadView | وقتی View Controller سلسلهمراتب View خود را بارگذاری میکند | راهاندازی سفارشی بدون storyboard |
| viewDidLoad | پس از بارگذاری View در حافظه (یک بار) | تنظیم UI، بارگذاری دادههای اولیه |
| viewWillAppear | قبل از ظاهر شدن View روی صفحه | بهروزرسانی داده، اشتراک در اعلانها |
| viewDidAppear | پس از ظاهر شدن View روی صفحه | شروع انیمیشنها، شروع انیمیشنهای ردیابی |
| viewWillDisappear | قبل از ناپدید شدن View از صفحه | ذخیره وضعیت، لغو اشتراک اعلانها |
| viewDidDisappear | پس از ناپدید شدن View از صفحه | توقف انیمیشنها، آزادسازی منابع |
| dealloc | هنگام نابودی View Controller | آزادسازی همه منابع |
مهم: viewDidLoad فقط یک بار در طول عمر View Controller فراخوانی میشود. برای بهروزرسانی داده در هر بار ظاهر شدن، از viewWillAppear استفاده کنید. اگر در viewWillAppear در NotificationCenter اشتراک میکنید، حتماً در viewDidDisappear اشتراک را لغو کنید تا از نشت حافظه جلوگیری شود.
SwiftUI چرخه زندگی View را از طریق ساختارهای View مدیریت میکند. به جای روشهای بازخوانی، SwiftUI از اصلاحکنندههای onAppear و onDisappear استفاده میکند. برای وضعیتهای سراسری برنامه، App Lifecycle از طریق پروتکلهای App و Scene استفاده میشود. SwiftUI به طور خودکار ایجاد و نابودی View را بر اساس وضعیت مدیریت میکند که توسعه را ساده میکند اما نیاز به درک هویت و طول عمر View دارد.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner یک رابط از Android Architecture Components است که یک شیء دارای چرخه زندگی (Activity, Fragment) را علامتگذاری میکند. LifecycleObserver یک رابط است که به یک شیء اجازه میدهد در رویدادهای LifecycleOwner مشترک شود. با هم، آنها پایه مدیریت واکنشی چرخه زندگی در توسعه مدرن Android را تشکیل میدهند.
به جای فراخوانی صریح روشها در onStart/onStop، توصیه میشود از DefaultLifecycleObserver (جایگزین LifecycleObserver قدیمی با حاشیهنویسیهای @OnLifecycleEvent) استفاده کنید. این رویکردی است که توسط Google برای ViewModel و سایر مؤلفههایی که نیاز به واکنش به چرخه زندگی بدون داشتن ارجاعات مستقیم به Activity یا Fragment دارند، ترویج میشود.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
در IT Sectr، ما از LifecycleOwner در تمام پروژههای Android استفاده میکنیم. ViewModel از طریق viewModelScope و lifecycleScope در LifecycleOwner Activity مشترک میشود و لغو خودکار کوروتینها را هنگام نابودی Activity تضمین میکند. این کار از نشت حافظه جلوگیری میکند و کد را تمیزتر و امنتر میکند.
سوالات متداول
Activity شش حالت را طی میکند: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
ترتیب: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad یک بار فراخوانی میشود.
LifecycleOwner مؤلفهای از Android Architecture Components است که صاحب چرخه زندگی Activity یا Fragment است. امکان اشتراک در رویدادها را از طریق LifecycleObserver فراهم میکند.
برنامه iOS پنج حالت را طی میکند: Not Running, Inactive, Active, Background, Suspended. انتقالات از طریق UIApplicationDelegate مدیریت میشوند.
Saved State مکانیزم Android برای حفظ وضعیت Activity/Fragment در هنگام چرخش صفحه یا بازآفرینی فرآیند است. از onSaveInstanceState و SavedStateHandle استفاده میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.