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