Navigasi mundur adalah cara pengguna bergerak mundur dalam histori layar yang sebelumnya mereka kunjungi. Semua perangkat Android menyediakan tombol Kembali untuk jenis navigasi ini, jadi jangan menambahkan tombol Kembali ke UI aplikasi Anda. Bergantung pada perangkat Android pengguna, tombol ini mungkin berupa tombol fisik atau tombol software.
Android menyimpan data sebelumnya dari tujuan saat pengguna bernavigasi di dalam aplikasi Anda. Hal ini memungkinkan Android menavigasi dengan benar ke tujuan sebelumnya saat tombol Kembali ditekan. Namun, ada beberapa kasus ketika aplikasi Anda mungkin perlu mengimplementasikan perilaku Kembali-nya sendiri untuk memberikan pengalaman pengguna sebaik mungkin.
Misalnya, saat menggunakan WebView
,
sebaiknya Anda mengganti perilaku tombol Kembali default agar pengguna
dapat kembali menjelajahi histori penjelajahan web mereka, bukan layar sebelumnya
di aplikasi Anda.
Android 13 dan yang lebih baru menyertakan gestur kembali prediktif untuk perangkat Android. Untuk mempelajari fitur ini lebih lanjut, lihat Menambahkan dukungan untuk gestur kembali prediktif.
Mengimplementasikan navigasi kembali kustom
ComponentActivity
, class dasar
untuk FragmentActivity
dan AppCompatActivity
,
memungkinkan Anda mengontrol perilaku tombol Kembali dengan menggunakan
OnBackPressedDispatcher
-nya,
yang dapat Anda ambil dengan memanggil getOnBackPressedDispatcher()
.
OnBackPressedDispatcher
mengontrol cara peristiwa tombol Kembali dikirim ke salah satu atau beberapa objek OnBackPressedCallback
. Konstruktor untuk OnBackPressedCallback
mengambil boolean untuk status aktif awal. Saat callback diaktifkan—yaitu,
isEnabled()
menampilkan true
—dispatcher memanggil
handleOnBackPressed()
callback untuk menangani peristiwa tombol Kembali. Anda dapat mengubah status aktif dengan memanggil setEnabled()
.
Callback ditambahkan menggunakan metode addCallback
. Sebaiknya gunakan
metodeaddCallback()
,
yang memakai LifecycleOwner
.
Hal ini memastikan bahwa OnBackPressedCallback
hanya akan ditambahkan saat LifecycleOwner
adalah Lifecycle.State.STARTED
.
Aktivitas ini juga akan menghapus callback yang terdaftar saat
LifecycleOwner
terkait dihancurkan, yang mencegah kebocoran memori dan membuat
LifecycleOwner
cocok
untuk digunakan dalam fragmen atau pemilik siklus proses lain yang memiliki masa berlaku lebih pendek
daripada aktivitas tersebut.
Berikut adalah contoh implementasi callback:
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback is only called when MyFragment is at least started val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback is only called when MyFragment is at least started OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
Anda dapat memberikan beberapa callback menggunakan addCallback()
.
Saat melakukannya, callback akan dipanggil dalam urutan terbalik dari urutan
ketika ditambahkan—callback yang ditambahkan terakhir adalah yang pertama diberi kesempatan untuk menangani
peristiwa tombol Kembali. Misalnya, jika Anda menambahkan tiga callback bernama
one
, two
, dan three
, secara berurutan, callback tersebut akan dipanggil dalam urutan
three
, two
, one
.
Callback mengikuti pola Chain of Responsibility. Setiap callback dalam rangkaian hanya dipanggil jika callback sebelumnya tidak diaktifkan. Ini berarti bahwa dalam
contoh sebelumnya, callback two
dipanggil hanya jika callback three
tidak diaktifkan, dan callback one
hanya dipanggil jika callback two
tidak diaktifkan.
Perhatikan bahwa saat callback ditambahkan menggunakan addCallback()
,
callback tidak ditambahkan ke chain of responsibility hingga
LifecycleOwner
memasuki status Lifecycle.State.STARTED
.
Sebaiknya ubah status diaktifkan pada OnBackPressedCallback
untuk sementara guna mempertahankan urutan yang dijelaskan di atas.
Sangat penting bagi Anda untuk memiliki callback yang didaftarkan di beberapa
pemilik siklus proses bertingkat.
Jika ingin menghapus OnBackPressedCallback
seluruhnya,
Anda dapat memanggil
remove()
.
Hal ini biasanya tidak diperlukan karena callback otomatis dihapus saat
LifecycleOwner
terkait telah
dihancurkan.
Aktivitas onBackPressed()
Jika Anda menggunakan
onBackPressed()
untuk menangani peristiwa tombol Kembali, kami merekomendasi untuk menggunakan
OnBackPressedCallback
.
Namun, jika Anda tidak dapat melakukan perubahan ini, aturan-aturan berikut akan berlaku:
- Semua callback yang didaftarkan melalui
addCallback
akan dievaluasi saat Anda memanggilsuper.onBackPressed()
. - Di Android 12 (level API 32) dan yang lebih rendah,
onBackPressed
selalu dipanggil, terlepas dari instanceOnBackPressedCallback
yang didaftarkan.