Thêm khả năng hỗ trợ cho tính năng xem trước thao tác quay lại

Hình 1. Bản minh hoạ giao diện cử chỉ xem trước thao tác quay lại trên điện thoại

Tính năng Xem trước thao tác quay lại (một tính năng điều hướng bằng cử chỉ) cho phép người dùng xem trước vị trí mà thao tác vuốt quay lại sẽ đưa họ đến.

Ví dụ: việc sử dụng cử chỉ quay lại có thể hiển thị bản xem trước dạng động của Màn hình chính đằng sau ứng dụng của bạn, như trình bày trong bản minh hoạ ở hình 1.

Kể từ Android 15, tuỳ chọn dành cho nhà phát triển đối với ảnh động xem trước thao tác quay lại sẽ không còn nữa. Ảnh động hệ thống (chẳng hạn như quay lại trang chủ, giữa các tác vụ và giữa các hoạt động) hiện xuất hiện cho những ứng dụng đã chọn sử dụng tính năng xem trước thao tác quay lại hoàn toàn hoặc ở cấp độ hoạt động.

Bạn có thể kiểm thử ảnh động quay lại màn hình chính này (như mô tả trong phần sau của trang này).

Nhằm hỗ trợ tính năng xem trước thao tác quay lại, bạn phải cập nhật ứng dụng bằng OnBackPressedCallback có khả năng tương thích ngược trong AndroidX Activity 1.6.0 trở lên hoặc API nền tảng OnBackInvokedCallback mới. Hầu hết ứng dụng đều sử dụng API AndroidX có khả năng tương thích ngược.

Bản cập nhật này cung cấp một đường dẫn di chuyển để chặn thao tác quay lại sao cho đúng cách, thông qua việc thay thế tính năng chặn ngược từ KeyEvent.KEYCODE_BACK và bất kỳ lớp (class) nào bằng các phương thức onBackPressed như ActivityDialog nhờ Back API (API Quay lại) mới của hệ thống.

Lớp học lập trình và video về Google I/O

Ngoài việc sử dụng tài liệu này trên trang này, hãy thử tham khảo lớp học lập trình của chúng tôi. Lớp học này cung cấp cách triển khai trường hợp sử dụng phổ biến của WebView giúp xử lý tính năng xem trước thao tác quay lại bằng AndroidX Activity API.

Bạn cũng có thể xem video về Google I/O của chúng tôi, trong đó nêu thêm các ví dụ về việc triển khai AndroidX và API nền tảng.

Xử lý cử chỉ quay lại tuỳ chỉnh trong Compose

Compose cung cấp thành phần kết hợp PredictiveBackHandler để xử lý các cử chỉ quay lại tuỳ chỉnh. API này cho phép bạn phản hồi cử chỉ quay lại và cung cấp một Flow gồm các đối tượng BackEventCompat mà bạn có thể dùng để triển khai các ảnh động hoặc hiệu ứng chuyển đổi tuỳ chỉnh khi người dùng vuốt.

Để sử dụng PredictiveBackHandler, hãy đảm bảo ứng dụng của bạn có phần phụ thuộc androidx.activity:activity-compose (phiên bản 1.8.0 trở lên):

// In your build.gradle.kts file:
dependencies {
    implementation("androidx.activity:activity-compose:1.8.0")
}

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress.
        }
        // Handle the final back action (e.g., navigate back).
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI.
    }
}

Nếu bạn chỉ cần chặn cử chỉ quay lại mà không cần theo dõi tiến trình, hãy sử dụng BackHandler.

Cập nhật một ứng dụng sử dụng tính năng điều hướng quay lại mặc định

Tính năng xem trước thao tác quay lại được bật theo mặc định.

Nếu ứng dụng của bạn dùng Mảnh (Fragment) hoặc Thành phần điều hướng (Navigation component), hãy nâng cấp lên tối thiểu là AndroidX Activity 1.6.0.

Cập nhật một ứng dụng sử dụng tính năng điều hướng quay lại tuỳ chỉnh

Nếu ứng dụng của bạn triển khai hành vi quay lại tuỳ chỉnh, thì sẽ có nhiều đường dẫn di chuyển tuỳ thuộc vào việc ứng dụng đó có sử dụng AndroidX hay không và cách xử lý thao tác điều hướng quay lại.

Cách ứng dụng của bạn xử lý tính năng điều hướng quay lại Đường dẫn di chuyển đề xuất (đường liên kết trên trang này)
API AndroidX Di chuyển phương thức triển khai quay lại AndroidX hiện có
API nền tảng không được hỗ trợ Di chuyển ứng dụng AndroidX chứa API điều hướng quay lại không được hỗ trợ sang API AndroidX

Di chuyển cách triển khai tính năng điều hướng quay lại của AndroidX

Đây là trường hợp sử dụng phổ biến nhất (và được đề xuất nhiều nhất). Cách này áp dụng cho các ứng dụng mới hoặc ứng dụng hiện có triển khai cách xử lý thao tác bằng cử chỉ tuỳ chỉnh bằng OnBackPressedDispatcher, như mô tả trong phần Cung cấp tính năng điều hướng quay lại tuỳ chỉnh.

Để đảm bảo rằng các API vốn đang sử dụng OnBackPressedDispatcher (chẳng hạn như Mảnh và Thành phần điều hướng) hoạt động liền mạch với tính năng xem trước thao tác quay lại, hãy nâng cấp lên AndroidX Activity 1.6.0 trở lên.

// In your build.gradle file:
dependencies {
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0"
}

Di chuyển ứng dụng AndroidX chứa API điều hướng quay lại không được hỗ trợ sang API AndroidX

Nếu ứng dụng của bạn dùng thư viện AndroidX nhưng triển khai hoặc tham chiếu đến các API điều hướng quay lại không được hỗ trợ, thì bạn cần chuyển sang sử dụng API AndroidX để hỗ trợ hành vi mới.

Cách di chuyển API không được hỗ trợ sang API AndroidX:

  1. Di chuyển logic xử lý thao tác Quay lại của hệ thống sang OnBackPressedDispatcher của AndroidX bằng cách triển khai OnBackPressedCallback. Để biết hướng dẫn chi tiết, hãy xem bài viết Cung cấp tính năng điều hướng quay lại tuỳ chỉnh.

  2. Tắt OnBackPressedCallback khi bạn đã sẵn sàng dừng chặn thao tác quay lại.

  3. Dừng chặn các sự kiện quay lại bằng OnBackPressed hoặc KeyEvent.KEYCODE_BACK.

  4. Đảm bảo bạn đã nâng cấp lên AndroidX Activity 1.6.0 trở lên.

    // In your build.gradle file:
    dependencies {
        // Add this in addition to your other dependencies
        implementation "androidx.activity:activity:1.6.0"
    }
    

Chọn không sử dụng tính năng xem trước thao tác quay lại

Để chọn không sử dụng, trong AndroidManifest.xml, trong thẻ <application>, hãy đặt cờ android:enableOnBackInvokedCallback thành false.

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

Nếu bạn đặt giá trị này thành false, thì hệ thống sẽ làm như sau:

  • Tắt ảnh động xem trước thao tác quay lại của hệ thống.
  • Bỏ qua OnBackInvokedCallback, nhưng các lệnh gọi OnBackPressedCallback vẫn hoạt động.

Chọn không sử dụng tính năng ở cấp độ hoạt động

Cờ android:enableOnBackInvokedCallback cho phép bạn chọn không sử dụng ảnh động xem trước của hệ thống ở cấp hoạt động. Hành vi này giúp bạn dễ dàng quản lý việc di chuyển các ứng dụng lớn có nhiều hoạt động sang sử dụng tính năng xem trước thao tác quay lại.

Đoạn mã sau đây là ví dụ về enableOnBackInvokedCallback được đặt để bật ảnh động quay lại trang chủ của hệ thống từ MainActivity:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

Khi sử dụng cờ android:enableOnBackInvokedCallback, hãy lưu ý những điểm cần cân nhắc sau đây:

  • Việc thiết lập android:enableOnBackInvokedCallback=false sẽ tắt ảnh động xem trước thao tác quay lại ở cấp hoạt động hoặc cấp ứng dụng, tuỳ thuộc vào nơi bạn thiết lập thẻ và hướng dẫn hệ thống bỏ qua các lệnh gọi đến API nền tảng OnBackInvokedCallback. Tuy nhiên, các lệnh gọi đến OnBackPressedCallback sẽ tiếp tục chạy vì OnBackPressedCallback có khả năng tương thích ngược và sẽ gọi onBackPressed API (không hỗ trợ trước Android 13).
  • Việc thiết lập cờ enableOnBackInvokedCallback ở cấp ứng dụng sẽ thiết lập giá trị mặc định cho tất cả hoạt động trong ứng dụng. Bạn có thể ghi đè giá trị mặc định đối với mỗi hoạt động bằng cách thiết lập cờ ở cấp hoạt động, như minh hoạ trong đoạn mã ví dụ trước.

Nguyên tắc gọi lại

Hãy tuân thủ các nguyên tắc sau khi dùng lệnh gọi lại hệ thống được hỗ trợ: PredictiveBackHandler hoặc BackHandler (dành cho Compose), OnBackPressedCallback hoặc OnBackInvokedCallback.

Xác định Trạng thái giao diện người dùng có thể bật và tắt mỗi lệnh gọi lại

Trạng thái giao diện người dùng (UI state) là thuộc tính mô tả giao diện người dùng. Bạn nên làm theo các bước tổng quan sau đây.

  1. Xác định Trạng thái giao diện người dùng có thể bật và tắt mỗi lệnh gọi lại.

  2. Xác định trạng thái đó bằng cách sử dụng loại phần tử giữ dữ liệu có thể ghi nhận được, chẳng hạn như StateFlow hoặc Trạng thái Compose, đồng thời bật hoặc tắt lệnh gọi lại khi trạng thái thay đổi.

Nếu ứng dụng của bạn từng liên kết logic quay lại với các câu lệnh có điều kiện, thì việc này có thể cho biết rằng bạn đang phản ứng với sự kiện quay lại sau khi sự kiện đã xảy ra. Tránh mẫu này bằng các lệnh gọi lại mới hơn. Nếu có thể, hãy di chuyển lệnh gọi lại ra bên ngoài câu lệnh có điều kiện và thay vào đó, liên kết lệnh gọi lại đó với một loại phần tử giữ dữ liệu có thể ghi nhận được.

Sử dụng lệnh gọi lại hệ thống cho Logic giao diện người dùng

Logic giao diện người dùng (UI logic) cho biết cách hiển thị giao diện người dùng. Sử dụng lệnh gọi lại hệ thống để chạy logic giao diện người dùng, chẳng hạn như hiển thị hộp thoại hoặc chạy ảnh động.

Nếu ứng dụng của bạn bật OnBackPressedCallback hoặc OnBackInvokedCallback bằng PRIORITY_DEFAULT hoặc PRIORITY_OVERLAY, thì ảnh động xem trước thao tác quay lại sẽ không chạy và bạn phải xử lý sự kiện quay lại. Đừng tạo các lệnh gọi lại này để chạy logic nghiệp vụ hoặc để ghi nhật ký.

Hãy sử dụng các phương pháp sau nếu ứng dụng của bạn phải chạy logic nghiệp vụ hoặc ghi nhật ký khi người dùng vuốt để quay lại:

  • Trong Compose: Ghi nhật ký trong lệnh gọi lại onCleared() của ViewModel được liên kết với đích đến của Compose. Đây là tín hiệu tốt nhất để biết thời điểm một đích đến của Compose bị kéo ra khỏi ngăn xếp lui và bị huỷ.
  • Trên Android 16 trở lên: Sử dụng OnBackInvokedCallback với PRIORITY_SYSTEM_NAVIGATION_OBSERVER. Thao tác này sẽ tạo một lệnh gọi lại của trình quan sát không sử dụng sự kiện quay lại. Ví dụ: bạn có thể đăng ký lệnh gọi lại này khi người dùng vuốt ngược lại từ hoạt động gốc (rời khỏi ứng dụng của bạn) để ghi lại sự kiện quay lại hoặc chạy logic nghiệp vụ trong khi vẫn cho phép hiệu ứng quay lại màn hình chính phát.
  • Trong các ứng dụng dựa trên khung hiển thị: Ghi nhật ký trong các lệnh gọi lại vòng đời hoặc ngăn xếp lùi thay vì sử dụng các sự kiện quay lại:
    • Đối với các hiệu ứng chuyển đổi hoạt động, hãy kiểm tra xem isFinishing có phải là true trong Activity.onDestroy() hay không.
    • Đối với các hiệu ứng chuyển đổi giữa các mảnh, hãy kiểm tra xem isRemoving có phải là true trong vòng đời khung hiển thị onDestroy() của Mảnh hay không, hoặc sử dụng FragmentManager.OnBackStackChangedListener (onBackStackChangeStarted/onBackStackChangeCommitted).

Tạo lệnh gọi lại trách nhiệm duy nhất

Bạn có thể thêm nhiều lệnh gọi lại vào trình điều phối. Các lệnh gọi lại được thêm vào một ngăn xếp, trong đó lệnh gọi lại được bật và thêm gần đây nhất sẽ xử lý cử chỉ quay lại tiếp theo với một lệnh gọi lại cho mỗi thao tác quay lại.

Sẽ dễ dàng hơn khi quản lý trạng thái đã bật của một lệnh gọi lại nếu lệnh gọi lại đó chỉ có một trách nhiệm duy nhất. Ví dụ:

Sắp xếp các lệnh gọi lại trong ngăn xếp trong Compose.
Hình 2. Sơ đồ ngăn xếp lệnh gọi lại trong Compose.

Hình 2 cho thấy cách bạn có thể có nhiều lệnh gọi lại trong ngăn xếp, mỗi lệnh gọi lại chịu trách nhiệm cho một việc. Trong Compose, các lệnh gọi lại được đánh giá từ thành phần kết hợp trong cùng đến thành phần kết hợp ngoài cùng và một lệnh gọi lại chỉ chạy nếu các lệnh gọi lại trước đó trong ngăn xếp bị vô hiệu hoá:

  • Thông báo "Bạn có chắc chắn..." PredictiveBackHandler sẽ được bật khi người dùng nhập dữ liệu vào biểu mẫu và tắt trong trường hợp khác. Khi được bật, chế độ này sẽ chặn cử chỉ quay lại để hiển thị hộp thoại xác nhận hoặc ảnh động tuỳ chỉnh trong ứng dụng.
  • BackHandler ở cấp màn hình sẽ chạy nếu lệnh gọi lại trước đó bị tắt. Trong ví dụ này, tính năng này bị tắt.
  • Lệnh gọi lại NavHost xử lý thao tác điều hướng quay lại để bật các đích đến khỏi ngăn xếp lui nếu các lệnh gọi lại tuỳ chỉnh trước đó bị vô hiệu hoá.
  • Cuối cùng, hệ thống sẽ xử lý cử chỉ quay lại nếu tất cả các lệnh gọi lại trước đó bị vô hiệu hoá. Khi ngăn xếp lui ở đích đến gốc, hệ thống sẽ kích hoạt ảnh động ở cấp hệ thống, chẳng hạn như quay lại trang chủ, giữa các hoạt động và tác vụ.

Hành vi ngăn xếp tương tự cũng áp dụng trong các ứng dụng dựa trên Khung hiển thị: OnBackPressedCallback được bật và thêm gần đây nhất sẽ được ưu tiên, quay lại FragmentManager và cuối cùng là xử lý thao tác quay lại của hệ thống.

Kiểm thử ảnh động xem trước thao tác quay lại

Kể từ Android 15, ảnh động hệ thống (chẳng hạn như ảnh động quay lại trang chủ, giữa các tác vụ và giữa các hoạt động) sẽ được bật theo mặc định cho những ứng dụng hỗ trợ chế độ xem trước thao tác quay lại. Các tính năng này không còn nằm trong phần tuỳ chọn cho nhà phát triển nữa.

Trên thiết bị chạy Android 13 hoặc Android 14, bạn có thể bật tuỳ chọn dành cho nhà phát triển để kiểm thử ảnh động quay lại màn hình chính như trong Hình 1:

  1. Trên thiết bị của bạn, hãy chuyển đến phần Cài đặt > Hệ thống > Tuỳ chọn cho nhà phát triển (Settings > System > Developer options).

  2. Chọn Ảnh động vuốt ngược dự đoán.

  3. Chạy ứng dụng đã cập nhật và dùng cử chỉ vuốt ngược để xem ứng dụng hoạt động.