Cung cấp tính năng điều hướng quay lại tuỳ chỉnh

Người dùng di chuyển ngược lại qua các màn hình bằng thao tác điều hướng quay lại. Hầu hết các thiết bị Android đều có nút quay lại (vật lý, phần mềm hoặc dựa trên cử chỉ). Thông thường, bạn không nên thêm nút quay lại vào ứng dụng. Tuy nhiên, các thiết bị Android Automotive OS (AAOS) ở chế độ tương thích sẽ dùng nút quay lại của hệ thống. Thành phần này xử lý thao tác điều hướng, vì vậy bạn không cần thêm thao tác điều hướng của riêng mình. Để biết thông tin chi tiết, hãy xem bài viết Chế độ tương thích AAOS.

Android duy trì một ngăn xếp lui của các đích đến khi người dùng di chuyển trong ứng dụng. Điều này thường cho phép Android điều hướng chính xác đến các đích đến trước đó khi nhấn nút Quay lại. Tuy nhiên, trong một số trường hợp, có thể ứng dụng cần phải triển khai thao tác Quay lại để mang lại trải nghiệm người dùng tốt nhất. Ví dụ: khi sử dụng WebView, bạn có thể ghi đè hành vi mặc định của nút Quay lại để cho phép người dùng quay lại thông qua nhật ký duyệt web thay vì các màn hình trước đó trong ứng dụng.

Triển khai tính năng điều hướng quay lại tuỳ chỉnh trong Compose

Trong Jetpack Compose, bạn có thể xử lý thao tác điều hướng quay lại tuỳ chỉnh bằng thành phần kết hợp BackHandler.

Khi sử dụng Navigation Compose, bạn thường dùng NavController.navigateUp() hoặc NavController.popBackStack() để chuyển đến màn hình trước trong ngăn xếp lui. Tuy nhiên, BackHandler rất hữu ích trong trường hợp bạn muốn triển khai hành vi tuỳ chỉnh khi người dùng nhấn nút quay lại của hệ thống hoặc sử dụng cử chỉ quay lại. Ví dụ: nếu đang hiển thị một WebView trong ứng dụng, bạn có thể muốn cho phép người dùng quay lại thông qua nhật ký duyệt web khi họ nhấn nút quay lại hệ thống.

Nếu bạn có nhiều thành phần kết hợp BackHandler được bật ở các cấp độ khác nhau của cây thành phần kết hợp, thì chỉ thành phần kết hợp trong cùng mới chặn sự kiện quay lại.

Triển khai tính năng điều hướng quay lại tuỳ chỉnh bằng Khung hiển thị

ComponentActivity, lớp cơ sở cho FragmentActivityAppCompatActivity, cho phép bạn kiểm soát hành vi của nút Quay lại bằng cách sử dụng OnBackPressedDispatcher mà bạn có thể truy xuất bằng cách gọi getOnBackPressedDispatcher().

OnBackPressedDispatcher kiểm soát cách gửi các sự kiện nút Quay lại đến một hoặc nhiều đối tượng OnBackPressedCallback. Hàm khởi tạo cho OnBackPressedCallback lấy giá trị boolean làm trạng thái kích hoạt ban đầu. Chỉ khi một lệnh gọi lại được kích hoạt (ví dụ: khi isEnabled() trả về true), trình điều phối mới gọi handleOnBackPressed() của lệnh gọi lại để xử lý sự kiện cho nút Quay lại. Bạn có thể thay đổi trạng thái đã kích hoạt đó bằng cách gọi setEnabled().

Lệnh gọi lại được thêm bằng các phương thức addCallback. Sử dụng phương thức addCallback(). Phương thức này lấy một LifecycleOwner. Bằng cách này, OnBackPressedCallback chỉ được thêm khi LifecycleOwner có giá trị là Lifecycle.State.STARTED. Hoạt động này cũng xoá các lệnh gọi lại đã đăng ký khi LifecycleOwner liên kết với các lệnh gọi lại này bị huỷ. Điều này giúp ngăn chặn việc rò rỉ bộ nhớ và đảm bảo sử dụng phù hợp các lệnh gọi lại trong mảnh hoặc chủ sở hữu vòng đời khác có thời gian hoạt động ngắn hơn.

Dưới đây là ví dụ về cách triển khai lệnh gọi lại:

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()
    }
    ...
}

Bạn có thể cung cấp nhiều lệnh gọi lại bằng addCallback(). Khi thực hiện việc này, các lệnh gọi lại được gọi theo thứ tự ngược lại khi chúng được thêm vào - trong đó hàm được thêm vào sau cùng sẽ được dùng để xử lý sự kiện nút Quay lại. Ví dụ: nếu bạn đã thêm ba lệnh gọi lại có tên one, twothree theo thứ tự, thì các lệnh gọi lại đó sẽ được gọi theo thứ tự tương ứng là three, two, và one.

Lệnh gọi lại tuân theo mẫu Chuỗi trách nhiệm. Mỗi lệnh gọi lại trong chuỗi chỉ được gọi nếu hàm trước đó không được bật. Điều này có nghĩa là trong ví dụ trước đó, lệnh gọi lại two sẽ chỉ được gọi nếu bạn không bật lệnh gọi lại three. Lệnh gọi lại one sẽ chỉ được gọi nếu lệnh gọi lại two không được bật, v.v.

Lưu ý rằng khi được thêm bằng addCallback(), lệnh gọi lại sẽ không được thêm vào chuỗi trách nhiệm cho đến khi LifecycleOwner chuyển sang trạng thái Lifecycle.State.STARTED.

Bạn nên thay đổi trạng thái bật trên OnBackPressedCallback cho các thay đổi tạm thời vì chế độ này sẽ duy trì thứ tự mô tả ở trên. Điều này rất quan trọng khi đăng ký lại các lệnh gọi lại trên nhiều chủ sở hữu vòng đời lồng nhau.

Tuy nhiên, trong trường hợp muốn xoá hoàn toàn OnBackPressedCallback, bạn nên gọi remove(). Tuy nhiên, việc này thường không cần thiết vì các lệnh gọi lại sẽ tự động bị xoá khi LifecycleOwner được liên kết bị huỷ kích hoạt.