Siklus Proses di Jetpack Compose Bagian dari Android Jetpack.
Komponen berbasis siklus proses melakukan tindakan sebagai respons terhadap perubahan
status siklus proses aktivitas host. Artefak
androidx.lifecycle.compose
menyediakan API khusus yang secara otomatis membersihkan resource saat resource
keluar dari layar atau saat aplikasi masuk ke latar belakang.
API utama meliputi:
- Alur untuk
Lifecycle.Statesaat ini. LifecycleEffects, yang memungkinkan Anda menjalankan pemblokiran berdasarkanLifecycle.Eventtertentu.
Integrasi ini menyediakan hook yang mudah untuk mengelola siklus proses dalam hierarki Compose. Dokumen ini menguraikan cara Anda dapat menggunakannya di aplikasi Anda.
Mengumpulkan status siklus proses dengan alur
Lifecycle mengekspos properti currentStateFlow yang menyediakan
Lifecycle.State saat ini sebagai StateFlow Kotlin. Anda dapat mengumpulkan Flow ini sebagai
State. Hal ini memungkinkan aplikasi Anda membaca perubahan di Siklus Proses selama
komposisi.
val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()
Contoh sebelumnya dapat diakses menggunakan modul lifecycle-common. Metode
currentStateAsState() tersedia di modul lifecycle-runtime-compose, yang memungkinkan Anda membaca status Siklus Proses saat ini dengan mudah menggunakan
satu baris. Contoh berikut menunjukkan hal tersebut:
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
Menjalankan kode pada peristiwa siklus proses
Daripada membuat class terpisah yang menerapkan
DefaultLifecycleObserver
dan menambahkannya secara manual ke siklus proses, Anda dapat mendeklarasikan logika siklus proses secara inline
menggunakan efek tertentu. LifecycleEffects memungkinkan Anda menjalankan blok saat
Lifecycle.Event tertentu terjadi langsung dalam komposisi.
LifecycleEventEffect
Gunakan LifecycleEventEffect untuk menjalankan blok kode
saat peristiwa tertentu terjadi. Ini paling cocok untuk peristiwa sekali jalan seperti logging atau
analisis, yang tidak memerlukan keberhasilan atau hasil langsung.
@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
Untuk operasi mulai/berhenti yang dipasangkan yang perlu dijalankan saat aplikasi dimulai
(terlihat) dan dibersihkan saat aplikasi dihentikan (di latar belakang), gunakan
LifecycleStartEffect.
Mirip dengan efek Compose lainnya (seperti LaunchedEffect), LifecycleStartEffect
menerima kunci. Saat kunci berubah, blok akan dipicu untuk dijalankan lagi.
Saat peristiwa Lifecycle.Event.ON_STOP terjadi atau efek keluar dari
komposisi, blok onStopOrDispose akan dieksekusi untuk membersihkan pekerjaan apa pun yang
merupakan bagian dari blok awal.
@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)
}
}
}
Untuk mengetahui informasi tentang jenis efek samping lainnya, lihat Efek samping di Compose.
LifecycleResumeEffect
LifecycleResumeEffect berfungsi dengan cara yang sama seperti LifecycleStartEffect,
tetapi terikat pada peristiwa Lifecycle.Event.ON_RESUME. Composable ini juga
menyediakan blok onPauseOrDispose yang melakukan pembersihan saat ON_PAUSE
dikirim atau composable keluar dari layar.
API ini berguna untuk resource yang hanya perlu aktif saat pengguna berinteraksi dengan aplikasi—misalnya, kamera atau animasi.
@Composable
fun CameraPreview(cameraController: CameraController) {
LifecycleResumeEffect(cameraController) {
cameraController.startPreview()
onPauseOrDispose {
cameraController.stopPreview()
}
}
}
Mengakses LifecycleOwner
Di Compose, LifecycleOwner tersedia secara implisit melalui CompositionLocal bernama LocalLifecycleOwner. Secara
default, host root hierarki komposisi Anda menyediakan pemilik ini.
val lifecycleOwner = LocalLifecycleOwner.current
Untuk banyak aplikasi, memeriksa pemilik default ini atau meneruskannya ke efek yang kompatibel dengan siklus proses sudah cukup. Namun, untuk navigasi kustom atau tata letak yang kompleks, Anda
mungkin ingin membuat LifecycleOwner sendiri untuk mencakup status siklus proses ke
bagian UI tertentu. Misalnya, library navigasi (seperti Navigation
3) melakukannya secara otomatis untuk memberikan siklus prosesnya sendiri pada setiap
layar.
Membuat LifecycleOwner kustom
API rememberLifecycleOwner() memungkinkan Anda membuat dan mengingat LifecycleOwner
kustom. Hal ini sangat berguna untuk komponen seperti
HorizontalPager, di mana Anda hanya ingin halaman yang terlihat dan stabil menjadi
RESUMED, sambil menetapkan maxState STARTED untuk halaman di luar layar yang berdekatan.
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.
}
}
Untuk mengetahui informasi selengkapnya tentang CompositionLocal, lihat Data yang dicakup secara lokal dengan
CompositionLocal.
Praktik terbaik untuk komponen berbasis siklus proses
- Buatlah pengontrol UI yang seramping mungkin. Pengontrol
UI tidak boleh mencoba memperoleh datanya sendiri; sebagai gantinya, gunakan
ViewModeluntuk tujuan tersebut, dan amati objekStateFlowuntuk mencerminkan perubahan ke UI. - Cobalah untuk menulis UI berbasis data, yang tanggung jawab pengontrol UI-nya adalah memperbarui UI saat terjadi perubahan data, atau memberitahukan kembali tindakan pengguna ke
ViewModel. - Tempatkan logika data Anda di
class
ViewModel.ViewModelharus berfungsi sebagai penghubung antara pengontrol UI dan seluruh aplikasi Anda. Namun, perlu diperhatikan,ViewModeltidak bertanggung jawab untuk mengambil data (misalnya, dari jaringan). Sebagai gantinya,ViewModelharus memanggil komponen yang sesuai untuk mengambil data, kemudian menyediakan kembali hasilnya ke pengontrol UI. - Gunakan coroutine Kotlin untuk mengelola tugas yang berjalan lama dan operasi lain yang berjalan secara asinkron.
- Simpan logika mulai/berhenti di dalam composable yang benar-benar membutuhkannya. Dengan cara ini, logika akan otomatis dihapus jika elemen UI tertentu tersebut dihapus dari layar (misalnya, di dalam grafik navigasi atau saat visibilitas bersifat kondisional).
- Gunakan
collectAsStateWithLifecycleuntuk data. Jangan memulai atau menghentikan pengumpulanFlowsecara manual berdasarkan peristiwa siklus proses. Sebagai gantinya, gunakancollectAsStateWithLifecycleuntuk mengonversi aliran menjadi status UI secara efisien. Hal ini menghemat baterai dan resource karenaFlowdijeda saat aplikasi berada di latar belakang.
Untuk mengetahui informasi selengkapnya tentang Flow, lihat Jenis status lain yang didukung.
Kasus penggunaan komponen berbasis siklus proses
Komponen siklus proses dapat mempermudah Anda dalam mengelola siklus proses dalam berbagai kasus. Beberapa contohnya adalah:
- Beralih antara update lokasi yang umum dan akurat. Gunakan
LifecycleStartEffectuntuk mengaktifkan update lokasi akurat saat aplikasi Anda terlihat (ON_START), dan secara otomatis menghapus pemroses atau beralih ke update lokasi umum saat aplikasi berada di latar belakang (ON_STOP). - Menghentikan atau memulai buffering video. Gunakan
LifecycleResumeEffectuntuk menunda pemutaran video sebenarnya hingga aplikasi sepenuhnya berada di latar depan dan interaktif (ON_RESUME), serta untuk memastikan pemutaran dijeda dan melepaskan resource saat aplikasi berada di latar belakang (ON_PAUSE). - Memulai dan menghentikan streaming jaringan. Gunakan
collectAsStateWithLifecycleuntuk mengamati aliran data berkelanjutan (seperti Flow Kotlin dari soket jaringan). Hal ini memberi Anda update live saat aplikasi berada di latar depan dan secara otomatis membatalkan pengumpulan saat aplikasi masuk ke latar belakang. - Menjeda dan melanjutkan tugas berat. Gunakan
LifecycleResumeEffectuntuk menangani penjedaan update visual berat saat aplikasi berada di latar belakang, dan melanjutkan update tersebut setelah aplikasi berada di latar depan.
Menangani peristiwa ON_STOP dengan aman
Compose dirancang untuk menangani peristiwa ON_STOP dengan aman.
- Status aman: Anda dapat memperbarui
MutableState(misalnya, denganuiState.value = ...) kapan saja, bahkan saat aplikasi berada di latar belakang. Compose menunggu hingga aplikasi terlihat untuk merender perubahan. - Pembersihan otomatis: Dengan efek seperti
LifecycleStartEffect, blok pembersihan (onStopOrDispose) Anda berjalan tepat saat siklus proses berpindah keSTOPPED. Hal ini mencegah Anda menahan resource berat (seperti kamera atau lokasi) saat aplikasi berada di latar belakang.
Untuk mengetahui informasi selengkapnya tentang MutableState, lihat Status dan Jetpack Compose.
Referensi lainnya
Untuk mempelajari lebih lanjut cara menangani siklus proses dengan komponen berbasis siklus proses, lihat referensi tambahan berikut.
Melihat konten
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Ringkasan LiveData
- Menggunakan coroutine Kotlin dengan komponen yang mendukung siklus proses
- Modul Status Tersimpan untuk ViewModel