چرخه حیات در Jetpack Compose بخشی از Android Jetpack.
مؤلفههای آگاه از چرخه حیات در پاسخ به تغییر در وضعیت چرخه حیات فعالیت میزبان، کنشهایی را انجام میدهند. ساخته
androidx.lifecycle.compose
میاناهای برنامهسازی کاربردی اختصاصیای ارائه میدهد که وقتی منابع از صفحه خارج میشوند یا وقتی برنامه به پسزمینه میرود، بهطور خودکار آنها را پاکسازی میکند.
APIهای کلیدی شامل موارد زیر است:
- جریانهای
Lifecycle.Stateکنونی. LifecycleEffects، که به شما امکان میدهد بلوکی را براساسLifecycle.Eventخاصی اجرا کنید.
این ادغامها قلابهای مناسبی برای مدیریت چرخههای حیات در سلسلهمراتب Compose ارائه میدهند. این سند نحوه استفاده از آنها را در برنامهتان شرح میدهد.
جمعآوری وضعیت چرخه حیات با گردش کارها
Lifecycle ویژگی currentStateFlow را نشان میدهد که
Lifecycle.State فعلی را بهعنوان StateFlow Kotlin ارائه میدهد. میتوانید این Flow را بهعنوان
State جمعآوری کنید. این کار به برنامه شما اجازه میدهد تغییرات در «چرخه حیات» را درطول
ترکیببندی بخواند.
val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()
مثال قبلی بااستفاده از واحد lifecycle-common قابلدسترسی است. روش
currentStateAsState() در ماژول lifecycle-runtime-compose
دردسترس است که به شما امکان میدهد بهراحتی وضعیت فعلی «چرخه حیات» را با یک
خط بخوانید. مثال زیر این موضوع را نشان میدهد:
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
اجرای کد در رویدادهای چرخه حیات
بهجای ایجاد کلاس جداگانهای که
DefaultLifecycleObserver
را پیادهسازی میکند و افزودن دستی آن به چرخه حیات، میتوانید منطق چرخه حیات را بهصورت درونخطی
بااستفاده از جلوههای خاص اعلام کنید. LifecycleEffects به شما امکان میدهد وقتی Lifecycle.Event خاصی مستقیماً در ترکیببندی رخ میدهد، بلوکی را اجرا کنید.
LifecycleEventEffect
از 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
برای عملیات جفتشده شروع/توقف که باید هنگام شروع برنامه (نمایان) اجرا شوند و هنگام توقف برنامه (در پسزمینه) پاکسازی شوند، از 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
LifecycleResumeEffect مانند 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 سفارشی
rememberLifecycleOwner() API به شما امکان میدهد 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باید جزء مناسب را برای واکشی دادهها فراخوانی کند، سپس نتیجه را به کنترلکننده واسط کاربر ارائه دهد. - از روالهای مشترک Kotlin برای مدیریت تکالیف طولانیمدت و سایر عملیاتی که میتوانند بهصورت ناهمگام اجرا شوند استفاده کنید.
- منطق شروع/توقف را در داخل ترکیبپذیری که واقعاً به آن نیاز دارد نگه دارید. بهاینترتیب، اگر آن عنصر میانای کاربر خاص از صفحهنمایش برداشته شود (برای مثال، داخل نمودار پیمایش یا زمانی که رؤیتپذیری مشروط باشد)، منطق بهطور خودکار برداشته میشود.
- استفاده از
collectAsStateWithLifecycleبرای داده. جمعآوریFlowرا بهصورت دستی براساس رویدادهای چرخه حیات شروع یا متوقف نکنید. درعوض، ازcollectAsStateWithLifecycleبرای تبدیل کارآمد جریانها به وضعیت واسط کاربر استفاده کنید. این کار باعث صرفهجویی در مصرف باتری و منابع میشود زیرا وقتی برنامه در پسزمینه است،Flowها موقتاً متوقف میشوند.
برای اطلاعات بیشتر درباره Flow، به دیگر انواع پشتیبانیشده وضعیت مراجعه کنید.
موارد استفاده برای مؤلفههای آگاه از چرخه حیات
مؤلفههای آگاه از چرخه حیات میتوانند مدیریت چرخههای حیات را در موارد مختلف برای شما بسیار آسانتر کنند. چند نمونه:
- جابهجایی بین بهروزرسانیهای مکان تقریبی و دقیق. از
LifecycleStartEffectبرای فعال کردن بهروزرسانیهای مکان دقیق در زمانی که برنامه شما قابلمشاهده است (ON_START) استفاده کنید و بهطور خودکار شنونده را پاک کنید یا وقتی برنامه در پسزمینه است، به بهروزرسانیهای مکان تقریبی بروید (ON_STOP). - متوقف کردن و شروع میانگیری ویدیو. از
LifecycleResumeEffectبرای بهتعویق انداختن بازپخش واقعی ویدیو تا زمانی که برنامه کاملاً در پیشزمینه و تعاملی (ON_RESUME) قرار گیرد استفاده کنید و مطمئن شوید که بازپخش متوقف میشود و منابع را هنگام قرار گرفتن برنامه در پسزمینه (ON_PAUSE) آزاد میکند. - شروع و توقف جاریسازی شبکه. از
collectAsStateWithLifecycleبرای مشاهده جریانهای مداوم داده (مانند Kotlin Flow از سوکت شبکه) استفاده کنید. این کار باعث میشود وقتی برنامه در پیشزمینه است بهروزرسانی زنده دریافت کنید و وقتی برنامه به پسزمینه میرود، جمعآوری بهطور خودکار لغو شود. - توقف موقت و ازسرگیری تکالیف سنگین. از
LifecycleResumeEffectبرای مدیریت توقف موقت بهروزرسانیهای دیداری سنگین وقتی برنامه در پسزمینه است استفاده کنید و آنها را پساز اینکه برنامه در پیشزمینه قرار گرفت ازسر بگیرید.
اداره کردن ایمن رویدادهای ON_STOP
Compose طوری طراحی شده است که رویدادهای ON_STOP را بهطور ایمن مدیریت کند.
- وضعیت ایمن است: میتوانید
MutableStateرا (برای مثال، باuiState.value = ...) در هر زمانی بهروز کنید، حتی وقتی برنامه در پسزمینه است. Compose تا زمانی که برنامه برای ارائه تغییرات قابلمشاهده باشد منتظر میماند. - پاکسازی خودکار: با جلوههایی مثل
LifecycleStartEffect، بلوک پاکسازی شما (onStopOrDispose) دقیقاً زمانی اجرا میشود که چرخه حیات بهSTOPPEDمنتقل میشود. این کار مانع از آن میشود که وقتی برنامه در پسزمینه است، منابع سنگین (مثل دوربین یا مکان) را نگه دارید.
برای اطلاعات بیشتر درباره MutableState، به حالت و Jetpack Compose مراجعه کنید.
منابع بیشتر
برای کسب اطلاعات بیشتر درباره مدیریت چرخههای حیات با مؤلفههای آگاه از چرخه حیات، به منابع اضافی زیر مراجعه کنید.
محتوا را مشاهده میکند
توصیهشده برای شما
- توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده میشود
- نمای کلی LiveData
- استفاده کردن از روالهای مشترک Kotlin با مؤلفههای آگاه از چرخه حیات
- ماژول Saved State برای ViewModel