Setiap instance Fragment
memiliki
siklus prosesnya sendiri. Saat pengguna menavigasi dan berinteraksi dengan aplikasi Anda,
fragmen mengalami transisi melalui berbagai status dalam siklus prosesnya
saat ditambahkan, dihapus, dan saat memasuki atau keluar layar.
Untuk mengelola siklus proses, Fragment
mengimplementasikan
LifecycleOwner
, yang menampilkan
objek Lifecycle
yang
dapat Anda akses melalui
metode
getLifecycle()
.
Setiap kemungkinan status Lifecycle
diwakili dalam
enum Lifecycle.State
.
Dengan membuat Fragment
di atas Lifecycle
, Anda dapat menggunakan teknik
dan class yang tersedia untuk
Menangani Siklus Proses dengan Komponen Berbasis Siklus Proses.
Misalnya, Anda dapat menampilkan lokasi perangkat di layar
menggunakan komponen berbasis siklus proses. Komponen ini otomatis dapat mulai
memproses saat fragmen menjadi aktif dan berhenti saat
fragmen berubah ke status tidak aktif.
Sebagai alternatif untuk penggunaan
LifecycleObserver
, class Fragment
menyertakan
metode callback yang sesuai dengan setiap
perubahan dalam siklus proses fragmen. Ini menyertakan
onCreate()
,
onStart()
,
onResume()
,
onPause()
,
onStop()
, dan
onDestroy()
.
Tampilan fragmen memiliki Lifecycle
terpisah yang dikelola secara independen
dari Lifecycle
fragmen. Fragmen mempertahankan
LifecycleOwner
untuk tampilannya, yang dapat diakses menggunakan
getViewLifecycleOwner()
atau
getViewLifecycleOwnerLiveData()
.
Memiliki akses ke Lifecycle
tampilan berguna untuk situasi
saat komponen berbasis Siklus Proses seharusnya hanya melakukan pekerjaan
bila tampilan fragmen ada, seperti mengamati
LiveData
yang hanya dimaksudkan
untuk ditampilkan di layar.
Topik ini membahas siklus proses Fragment
secara mendetail, yang menjelaskan beberapa
aturan yang menentukan status siklus proses fragmen dan menampilkan
hubungan antara status Lifecycle
dan callback
siklus proses fragmen.
Fragmen dan pengelola fragmen
Saat fragmen dibuat instance-nya, fragmen tersebut dimulai dalam
status INITIALIZED
. Agar fragmen bertransisi di sepanjang sisa siklus prosesnya,
fragmen tersebut harus ditambahkan
ke FragmentManager
. FragmentManager
bertanggung jawab untuk menentukan status fragmennya,
lalu memindahkannya ke status tersebut.
Di luar siklus proses fragmen, FragmentManager
juga bertanggung jawab
untuk melampirkan fragmen ke aktivitas host-nya dan melepaskannya saat
fragmen tidak lagi digunakan. Class Fragment
memiliki dua metode
callback, yakni onAttach()
dan onDetach()
, yang dapat Anda ganti untuk melakukan
pekerjaan saat salah satu peristiwa ini terjadi.
Callback onAttach()
dipanggil saat fragmen telah ditambahkan ke
FragmentManager
dan dilampirkan ke aktivitas host-nya. Pada titik ini,
fragmen aktif, dan FragmentManager
mengelola status siklus
prosesnya. Pada titik ini, metode FragmentManager
metode seperti
findFragmentById()
menampilkan fragmen ini.
onAttach()
selalu dipanggil sebelum status Siklus Proses apa pun berubah.
Callback onDetach()
dipanggil saat fragmen telah dihapus
dari FragmentManager
dan dilepaskan dari aktivitas host-nya. Fragmen
tidak lagi aktif dan tidak dapat diambil lagi
menggunakan findFragmentById()
.
onDetach()
selalu dipanggil setelah status Siklus Proses apa pun berubah.
Perhatikan bahwa callback ini tidak terkait dengan
metode
FragmentTransaction
, yakni
attach()
dan
detach()
.
Untuk informasi selengkapnya tentang metode ini, lihat
Transaksi fragmen.
Callback dan status siklus proses fragmen
Saat menentukan status siklus proses fragmen, FragmentManager
mempertimbangkan hal berikut:
- Status maksimum fragmen ditentukan oleh
FragmentManager
-nya. Fragmen tidak dapat berkembang melampaui statusFragmentManager
-nya. - Sebagai bagian dari
FragmentTransaction
, Anda dapat menyetel status siklus proses maksimum pada fragmen menggunakansetMaxLifecycle()
. - Status siklus proses fragmen tidak boleh lebih besar dari induknya. Misalnya, aktivitas atau fragmen induk harus dimulai sebelum fragmen turunannya. Demikian juga, fragmen turunan harus dihentikan sebelum aktivitas atau fragmen induknya.
Gambar 1 menunjukkan setiap status Lifecycle
fragmen dan hubungannya
dengan callback siklus proses dan
Lifecycle
tampilan fragmen.
Saat sedang menjalani siklus prosesnya, fragmen akan bergerak ke atas dan
ke bawah melewati statusnya. Misalnya, fragmen yang ditambahkan
ke bagian atas data sebelumnya bergerak ke atas dari CREATED
ke
STARTED
ke RESUMED
. Sebaliknya, saat dikeluarkan dari
data sebelumnya, fragmen akan bergerak ke bawah melewati status tersebut, dari
RESUMED
ke STARTED
hingga CREATED
dan terakhir DESTROYED
.
Transisi status ke atas
Saat bergerak ke atas melewati status siklus prosesnya, fragmen akan memanggil
callback siklus proses terkait terlebih dahulu untuk status barunya. Setelah callback ini
selesai,
Lifecycle.Event
yang relevan akan dimunculkan ke pengamat oleh Lifecycle
fragmen, yang diikuti dengan
Lifecycle
tampilan fragmen jika instance-nya telah dibuat.
Fragmen CREATED
Saat fragmen Anda mencapai status CREATED
, fragmen tersebut telah ditambahkan ke
FragmentManager
dan metode
onAttach()
telah dipanggil.
Ini akan menjadi tempat yang sesuai untuk memulihkan status tersimpan
terkait fragmen itu sendiri melalui
SavedStateRegistry
fragmen.
Perhatikan bahwa tampilan fragmen belum dibuat saat ini, dan
status apa pun terkait tampilan fragmen harus dipulihkan
hanya setelah tampilan dibuat.
Transisi ini memanggil
callback
onCreate()
. Callback juga menerima argumen
Bundle
savedInstanceState
berisi status
apa pun yang sebelumnya disimpan oleh
onSaveInstanceState()
.
Perlu diperhatikan bahwa savedInstanceState
memiliki nilai null
saat
fragmen pertama kali dibuat, tetapi akan selalu non-null untuk pembuatan ulang
selanjutnya meskipun Anda tidak mengganti onSaveInstanceState()
. Lihat
Menyimpan status dengan fragmen untuk
detail selengkapnya.
Fragmen CREATED dan Tampilan INITIALIZED
Lifecycle
tampilan fragmen hanya dibuat saat Fragment
menyediakan instance View
yang valid. Dalam
sebagian besar kasus, Anda dapat menggunakan
konstruktor fragmen
yang menggunakan @LayoutId
, yang otomatis akan meng-inflate tampilan
pada waktu yang tepat. Anda juga dapat mengganti
onCreateView()
untuk meng-inflate atau membuat tampilan fragmen secara terprogram.
Jika dan hanya jika tampilan fragmen Anda dibuat instance-nya dengan
View
non-null, View
tersebut akan ditetapkan pada fragmen dan dapat diambil
menggunakan getView()
. getViewLifecycleOwnerLiveData()
kemudian
diperbarui dengan
LifecycleOwner
INITIALIZED
baru yang sesuai dengan tampilan fragmen. Callback
siklus proses
onViewCreated()
juga dipanggil saat ini.
Ini adalah tempat yang sesuai untuk menyiapkan status awal tampilan Anda,
mulai mengamati instance LiveData
yang callback-nya memperbarui tampilan fragmen, dan menyiapkan
adaptor pada setiap instance
RecyclerView
atau
ViewPager2
dalam
tampilan fragmen Anda.
Fragmen dan Tampilan CREATED
Setelah tampilan fragmen dibuat, status tampilan sebelumnya, jika ada,
akan dipulihkan, dan Lifecycle
tampilan kemudian dipindahkan ke
status CREATED
. Pemilik siklus proses tampilan juga memunculkan
peristiwa ON_CREATE
ke pengamatnya. Di sini, Anda harus memulihkan status tambahan apa pun
terkait tampilan fragmen.
Transisi ini juga memanggil
callback
onViewStateRestored()
.
Fragmen dan Tampilan STARTED
Sebaiknya ikat
komponen berbasis Siklus Proses ke
status STARTED
fragmen karena status ini menjamin bahwa
tampilan fragmen tersedia, jika dibuat, dan aman
untuk melakukan FragmentTransaction
pada FragmentManager
turunan fragmen. Jika tampilan fragmen non-null, Lifecycle
tampilan fragmen dipindahkan ke STARTED
segera setelah Lifecycle
fragmen dipindahkan ke STARTED
.
Saat fragmen menjadi STARTED
,
callback onStart()
dipanggil.
Fragmen dan Tampilan RESUMED
Saat fragmen terlihat, semua
efek Animator
dan
Transition
telah selesai,
dan fragmen siap untuk interaksi pengguna. Lifecycle
fragmen
dipindahkan ke status RESUMED
, dan
callback onResume()
dipanggil.
Transisi ke RESUMED
adalah sinyal yang tepat untuk menunjukkan bahwa
pengguna sekarang dapat berinteraksi dengan fragmen Anda. Fragmen yang bukan
RESUMED
tidak boleh menetapkan fokus secara manual pada tampilannya
atau mencoba menangani visibilitas metode input.
Transisi status ke bawah
Saat fragmen bergerak ke bawah ke status siklus proses yang lebih rendah,
Lifecycle.Event
yang relevan
akan dimunculkan ke pengamat oleh Lifecycle
tampilan fragmen, jika instance-nya dibuat,
yang diikuti dengan Lifecycle
fragmen. Setelah peristiwa siklus proses fragmen
muncul, fragmen akan memanggil callback siklus proses terkait.
Fragmen dan Tampilan STARTED
Saat pengguna mulai meninggalkan fragmen, dan meskipun fragmen masih
terlihat, Lifecycle
untuk fragmen dan tampilannya dipindahkan kembali
ke status STARTED
dan memunculkan
peristiwa ON_PAUSE
ke
pengamatnya. Fragmen tersebut kemudian memanggil
callback onPause()
-nya.
Fragmen dan Tampilan CREATED
Setelah fragmen tidak lagi terlihat, Lifecycle
untuk fragmen
dan tampilannya dipindahkan ke status CREATED
dan memunculkan
peristiwa ON_STOP
ke pengamatnya. Transisi status ini tidak hanya dipicu oleh
fragmen atau aktivitas induk yang dihentikan, tetapi juga oleh penyimpanan
status oleh fragmen atau aktivitas induk. Perilaku ini menjamin bahwa
peristiwa ON_STOP
dipanggil sebelum status fragmen disimpan. Tindakan
ini menjadikan peristiwa ON_STOP
sebagai titik terakhir yang aman untuk melakukan
FragmentTransaction
pada FragmentManager
turunan.
Seperti yang ditunjukkan pada gambar 2, pengurutan
callback onStop()
dan penyimpanan status dengan onSaveInstanceState()
berbeda berdasarkan
API level. Untuk semua API level sebelum API 28, onSaveInstanceState()
dipanggil
sebelum onStop()
.
Untuk API level 28 dan yang lebih baru, urutan pemanggilan dibalik.
Fragmen CREATED dan Tampilan DESTROYED
Setelah semua
animasi dan transisi keluar
selesai, dan tampilan fragmen telah dilepaskan dari jendela, Lifecycle
tampilan
fragmen dipindahkan ke status DESTROYED
dan
memunculkan peristiwa ON_DESTROY
ke pengamatnya. Fragmen kemudian memanggil
callback
onDestroyView()
-nya. Pada titik ini, tampilan fragmen telah mencapai akhir siklus
prosesnya dan
getViewLifecycleOwnerLiveData()
menampilkan nilai null
.
Pada titik ini, semua referensi ke tampilan fragmen harus dihapus, sehingga sampah memori tampilan fragmen dapat dibersihkan.
Fragmen DESTROYED
Jika fragmen dihapus, atau jika FragmentManager
dihancurkan,
Lifecycle
fragmen dipindahkan ke status DESTROYED
dan mengirimkan
peristiwa ON_DESTROY
ke pengamatnya. Fragmen kemudian memanggil
callback
onDestroy()
-nya. Pada titik ini, fragmen telah mencapai akhir siklus prosesnya.
Referensi lainnya
Untuk informasi selengkapnya terkait siklus proses fragmen, lihat referensi tambahan berikut.