Berikan navigasi mundur khusus

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 memanggil super.onBackPressed().
  • Di Android 12 (level API 32) dan yang lebih rendah, onBackPressed selalu dipanggil, terlepas dari instance OnBackPressedCallback yang didaftarkan.