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 sebaiknya 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 biasanya 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.
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. Hanya saat callback diaktifkan (misalnya,
isEnabled()
menampilkan true
) dispatcher akan memanggil handleOnBackPressed()
callback untuk menangani peristiwa tombol Kembali. Anda dapat mengubah status aktif dengan memanggil setEnabled()
.
Callback ditambahkan melalui metode addCallback
. Sangat direkomendasikan untuk menggunakan metode addCallback()
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 membuatnya 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 will only be 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 will only be 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 melalui addCallback()
.
Saat melakukannya, callback akan dipanggil dalam urutan terbalik ketika ditambahkan - callback yang ditambahkan terakhir adalah callback pertama yang diberikan kesempatan untuk menangani peristiwa tombol Kembali. Misalnya, jika Anda menambahkan tiga callback bernama one
, two
, dan three
secara berurutan, maka callback tersebut akan dipanggil dalam urutan three
, two
, dan 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
akan dipanggil hanya jika callback three
tidak aktif. Callback one
hanya akan dipanggil jika callback two
tidak aktif, dan seterusnya.
Perhatikan bahwa saat ditambahkan melalui addCallback()
, callback tidak ditambahkan ke chain of responsibility hingga LifecycleOwner
memasuki status Lifecycle.State.STARTED
.
Mengubah status aktif pada OnBackPressedCallback
sangatlah direkomendasikan untuk perubahan sementara karena dapat menjaga pengurutan seperti yang dijelaskan di atas, yang sangat penting jika Anda memiliki callback yang didaftarkan di beberapa pemilik siklus proses bertingkat yang berbeda.
Namun, jika ingin menghapus OnBackPressedCallback
seluruhnya, Anda harus memanggil remove()
.
Akan tetapi, 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.