چرخه حیات در Jetpack Compose   بخشی از Android Jetpack.

مؤلفه‌های آگاه از چرخه حیات در پاسخ به تغییر در وضعیت چرخه حیات فعالیت میزبان، کنش‌هایی را انجام می‌دهند. ساخته androidx.lifecycle.compose میاناهای برنامه‌سازی کاربردی اختصاصی‌ای ارائه می‌دهد که وقتی منابع از صفحه خارج می‌شوند یا وقتی برنامه به پس‌زمینه می‌رود، به‌طور خودکار آن‌ها را پاک‌سازی می‌کند.

APIهای کلیدی شامل موارد زیر است:

این ادغام‌ها قلاب‌های مناسبی برای مدیریت چرخه‌های حیات در سلسله‌مراتب 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 مراجعه کنید.

منابع بیشتر

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

محتوا را مشاهده می‌کند