Siklus proses fragmen

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 status FragmentManager-nya.
  • Sebagai bagian dari FragmentTransaction, Anda dapat menyetel status siklus proses maksimum pada fragmen menggunakan setMaxLifecycle().
  • 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.
Status siklus proses fragmen dan hubungannya dengan callback
            siklus proses dan siklus proses tampilan fragmen
Gambar 1. Status Lifecycle fragmen dan hubungannya dengan callback siklus proses fragmen dan Lifecycle tampilan fragmen.

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.

Perbedaan urutan pemanggilan untuk onStop() dan onSaveInstanceState()
Gambar 2. Perbedaan urutan pemanggilan untuk onStop() dan onSaveInstanceState().

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.

Panduan

Blog