چرخه حیات در بخش Compose جتپک از جتپک اندروید .
کامپوننتهای آگاه از چرخه حیات، در پاسخ به تغییر در وضعیت چرخه حیات فعالیت میزبان، اقداماتی را انجام میدهند. artifact مربوط به androidx.lifecycle.compose APIهای اختصاصی ارائه میدهد که به طور خودکار منابع را هنگام ترک صفحه یا هنگام رفتن برنامه به پسزمینه، پاک میکنند.
API های کلیدی شامل موارد زیر هستند:
- جریانهای مربوط به
Lifecycle.Stateفعلی. -
LifecycleEffects، که به شما امکان میدهد یک بلوک را بر اساس یکLifecycle.Eventخاص اجرا کنید.
این ادغامها، قلابهای (hooks) مناسبی را برای مدیریت چرخههای حیات (lifecycles) در سلسله مراتب Compose فراهم میکنند. این سند نحوه استفاده از آنها را در برنامه شما شرح میدهد.
جمعآوری وضعیت چرخه حیات با جریانها
Lifecycle یک ویژگی currentStateFlow را در معرض نمایش قرار میدهد که Lifecycle.State فعلی را به عنوان یک Kotlin StateFlow ارائه میدهد. میتوانید این Flow به عنوان State جمعآوری کنید. این به برنامه شما اجازه میدهد تا تغییرات Lifecycle را در طول ترکیب بخواند.
val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()
مثال قبلی با استفاده از ماژول lifecycle-common قابل دسترسی است. متد currentStateAsState() در ماژول lifecycle-runtime-compose موجود است که به شما امکان میدهد به راحتی وضعیت فعلی Lifecycle را با یک خط بخوانید. مثال زیر این موضوع را نشان میدهد:
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
اجرای کد در رویدادهای چرخه عمر
به جای ایجاد یک کلاس جداگانه که DefaultLifecycleObserver را پیادهسازی میکند و اضافه کردن دستی آن به چرخه حیات، میتوانید منطق چرخه حیات را به صورت درونخطی با استفاده از جلوههای خاص اعلام کنید. LifecycleEffects به شما امکان میدهد وقتی یک Lifecycle.Event خاص مستقیماً در ترکیب رخ میدهد، یک بلوک را اجرا کنید.
اثر رویداد چرخه حیات
از LifecycleEventEffect برای اجرای یک بلوک کد هنگام وقوع یک رویداد خاص استفاده کنید. این روش برای رویدادهای یکباره مانند ثبت وقایع یا تجزیه و تحلیل، که در آنها نه موفقیت و نه نتیجه فوری مورد نیاز است، بهترین گزینه است.
@Composable
fun AnalyticsTracker(screenName: String) {
// Log an event when the app receives ON_RESUME (e.g. comes to foreground)
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
Analytics.logView(screenName)
}
}
اثر شروع چرخه حیات
برای عملیات شروع/توقف جفتشده که باید هنگام شروع برنامه (قابل مشاهده) اجرا شوند و هنگام توقف برنامه (در پسزمینه) پاکسازی شوند، LifecycleStartEffect استفاده کنید.
مشابه سایر افکتهای Compose (مانند LaunchedEffect )، LifecycleStartEffect کلید میپذیرد. وقتی کلید تغییر میکند، باعث میشود بلوک دوباره اجرا شود.
وقتی یک رویداد Lifecycle.Event.ON_STOP رخ میدهد یا افکت از ترکیب خارج میشود، بلوک onStopOrDispose را اجرا میکند تا هر کاری را که بخشی از بلوک شروع بوده است، پاک کند.
@Composable
fun LocationMonitor(locationManager: LocationManager) {
// Starts monitoring when ON_START is dispatched
// Stops monitoring when ON_STOP is dispatched
// (or the composable leaves the screen)
LifecycleStartEffect(locationManager) {
val listener = LocationListener { location ->
/* update UI */
}
locationManager.requestLocationUpdates(listener)
// The cleanup block automatically runs on ON_STOP or on disposal
onStopOrDispose {
locationManager.removeUpdates(listener)
}
}
}
برای اطلاعات در مورد سایر انواع عوارض جانبی، به عوارض جانبی در Compose مراجعه کنید.
اثر چرخه عمر رزومه
LifecycleResumeEffect همانند LifecycleStartEffect (LifecycleStartEffect) عمل میکند، اما به رویداد Lifecycle.Event.ON_RESUME گره خورده است. همچنین یک بلوک onPauseOrDispose ارائه میدهد که هنگام ارسال ON_PAUSE یا خروج فایل composable از صفحه، پاکسازی را انجام میدهد.
این API برای منابعی مفید است که فقط هنگام تعامل کاربر با برنامه باید فعال باشند - برای مثال، دوربینها یا انیمیشنها.
@Composable
fun CameraPreview(cameraController: CameraController) {
LifecycleResumeEffect(cameraController) {
cameraController.startPreview()
onPauseOrDispose {
cameraController.stopPreview()
}
}
}
دسترسی به LifecycleOwner
در Compose، LifecycleOwner به طور ضمنی از طریق CompositionLocal با نام LocalLifecycleOwner در دسترس است. به طور پیشفرض، میزبان ریشه سلسله مراتب ترکیب شما این مالک را فراهم میکند.
val lifecycleOwner = LocalLifecycleOwner.current
برای بسیاری از برنامهها، بررسی این مالک پیشفرض یا ارسال آن به افکتهای آگاه از چرخه حیات کافی است. با این حال، برای ناوبری سفارشی یا طرحبندیهای پیچیده، ممکن است بخواهید LifecycleOwner خودتان را ایجاد کنید تا حالتهای چرخه حیات را به بخشهای خاصی از رابط کاربری محدود کنید. به عنوان مثال، کتابخانههای ناوبری (مانند Navigation 3 ) این کار را به طور خودکار انجام میدهند تا به هر صفحه نمایش، چرخه حیات خاص خود را بدهند.
ایجاد یک LifecycleOwner سفارشی
API rememberLifecycleOwner() به شما امکان میدهد یک LifecycleOwner سفارشی ایجاد و به خاطر بسپارید. این امر به ویژه برای کامپوننتهایی مانند HorizontalPager مفید است، جایی که میخواهید فقط صفحه قابل مشاهده و مستقر RESUMED شود، در حالی که maxState را برای صفحات مجاور و خارج از صفحه، STARTED تنظیم میکنید.
val pagerState = rememberPagerState(pageCount = { 10 })
HorizontalPager(state = pagerState) { pageNum ->
val pageLifecycleOwner = rememberLifecycleOwner(
maxState = if (pagerState.settledPage == pageNum) {
Lifecycle.State.RESUMED
} else {
Lifecycle.State.STARTED
}
)
CompositionLocalProvider(LocalLifecycleOwner provides pageLifecycleOwner) {
// Your pages here. Their lifecycle-aware components respect the
// custom maxState defined above.
}
}
برای اطلاعات بیشتر در مورد CompositionLocal ، به دادههای محلی با CompositionLocal مراجعه کنید.
بهترین شیوهها برای کامپوننتهای آگاه از چرخه حیات
- کنترلرهای رابط کاربری خود را تا حد امکان ساده نگه دارید. آنها نباید سعی کنند دادههای خود را به دست آورند؛ در عوض، از یک
ViewModelبرای انجام این کار استفاده کنید و یک شیءStateFlowرا مشاهده کنید تا تغییرات را به رابط کاربری منعکس کند. - سعی کنید رابطهای کاربری مبتنی بر داده بنویسید که در آنها مسئولیت کنترلکننده رابط کاربری بهروزرسانی رابط کاربری با تغییر دادهها یا ارسال اعلانهای مربوط به اقدامات کاربر به
ViewModelباشد. - منطق دادههای خود را در کلاس
ViewModelقرار دهید.ViewModelباید به عنوان رابط بین کنترلر رابط کاربری و بقیه برنامه شما عمل کند. البته مراقب باشید،ViewModelوظیفه دریافت دادهها (مثلاً از یک شبکه) را ندارد. در عوض،ViewModelباید کامپوننت مناسب را برای دریافت دادهها فراخوانی کند، سپس نتیجه را به کنترلر رابط کاربری ارائه دهد. - از کوروتینهای کاتلین برای مدیریت وظایف طولانیمدت و سایر عملیاتی که میتوانند بهصورت غیرهمزمان اجرا شوند، استفاده کنید.
- منطق شروع/توقف را درون کامپوننتی که واقعاً به آن نیاز دارد نگه دارید. به این ترتیب، اگر آن عنصر رابط کاربری خاص از صفحه حذف شود (مثلاً درون یک نمودار ناوبری یا وقتی قابلیت مشاهده مشروط است)، منطق به طور خودکار حذف میشود.
- برای دادهها
collectAsStateWithLifecycleاستفاده کنید. جمعآوریFlowرا بر اساس رویدادهای چرخه عمر به صورت دستی شروع یا متوقف نکنید. در عوض، ازcollectAsStateWithLifecycleبرای تبدیل کارآمد streamها به حالت UI استفاده کنید. این کار باعث صرفهجویی در باتری و منابع میشود زیراFlowها وقتی برنامه در پسزمینه است، متوقف میشوند.
برای اطلاعات بیشتر در مورد Flow ها، به بخش «سایر انواع پشتیبانیشدهی state» مراجعه کنید.
موارد استفاده برای کامپوننتهای آگاه از چرخه عمر
کامپوننتهای آگاه از چرخه حیات میتوانند مدیریت چرخههای حیات را در موارد مختلف برای شما بسیار آسانتر کنند. چند نمونه از آنها عبارتند از:
- جابجایی بین بهروزرسانیهای موقعیت مکانی درشت و ریزدانه. از
LifecycleStartEffectبرای فعال کردن بهروزرسانیهای موقعیت مکانی ریزدانه در حالی که برنامه شما قابل مشاهده است (ON_START) استفاده کنید و به طور خودکار شنونده را پاک کنید یا وقتی برنامه در پسزمینه است (ON_STOP) به بهروزرسانیهای درشت دانه تغییر دهید. - توقف و شروع بافرینگ ویدیو. از
LifecycleResumeEffectبرای به تعویق انداختن پخش واقعی ویدیو تا زمانی که برنامه کاملاً در پیشزمینه و تعاملی باشد (ON_RESUME) استفاده کنید، و مطمئن شوید که پخش هنگام قرار گرفتن برنامه در پسزمینه متوقف شده و منابع را آزاد میکند (ON_PAUSE). - شروع و توقف استریمینگ شبکه. از
collectAsStateWithLifecycleبرای مشاهده استریمهای پیوسته دادهها (مانند یک جریان کاتلین از یک سوکت شبکه) استفاده کنید. این به شما امکان میدهد در حالی که برنامه در پیشزمینه است، بهروزرسانی زنده داشته باشید و وقتی برنامه به پسزمینه میرود، جمعآوری بهطور خودکار لغو میشود. - مکث و از سرگیری وظایف سنگین. از
LifecycleResumeEffectبرای مدیریت مکث بهروزرسانیهای بصری سنگین هنگامی که برنامه در پسزمینه است استفاده کنید و آنها را پس از قرار گرفتن برنامه در پیشزمینه از سر بگیرید.
مدیریت ایمن رویدادهای ON_STOP
Compose طوری طراحی شده است که رویدادهای ON_STOP را به طور ایمن مدیریت کند.
- وضعیت امن است: شما میتوانید
MutableState(برای مثال، باuiState.value = ...) در هر زمانی، حتی زمانی که برنامه در پسزمینه است، بهروزرسانی کنید. Compose منتظر میماند تا برنامه برای رندر تغییرات قابل مشاهده شود. - پاکسازی خودکار: با افکتهایی مانند
LifecycleStartEffect، بلوک پاکسازی شما (onStopOrDispose) دقیقاً زمانی اجرا میشود که چرخه حیات بهSTOPPEDمنتقل شود. این کار مانع از نگهداشتن منابع سنگین (مانند دوربین یا مکان) در حالی که برنامه در پسزمینه است، میشود.
برای اطلاعات بیشتر در مورد MutableState ، به State و Jetpack Compose مراجعه کنید.
منابع اضافی
برای کسب اطلاعات بیشتر در مورد مدیریت چرخههای حیات با کامپوننتهای آگاه از چرخه حیات، به منابع اضافی زیر مراجعه کنید.
محتوا را مشاهده میکند
{% کلمه به کلمه %}برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- مرور کلی LiveData
- استفاده از کوروتینهای کاتلین با کامپوننتهای آگاه از چرخه عمر
- ماژول وضعیت ذخیره شده برای ViewModel