Trạng thái ngủ đông của ứng dụng

Nếu ứng dụng của bạn nhắm mục tiêu Android 11 (API cấp 30) trở lên, và người dùng không tương tác với ứng dụng trong vài tháng, hệ thống sẽ đặt ứng dụng của bạn trong trạng thái ngủ đông. Hệ thống sẽ tối ưu hóa không gian lưu trữ thay vì hiệu suất, đồng thời bảo vệ dữ liệu của người dùng. Hành vi của hệ thống này tương tự như việc xảy ra khi người dùng dừng ứng dụng của bạn theo cách thủ công trong phần cài đặt hệ thống.

Ảnh hưởng của trạng thái ngủ đông

Như minh họa trong bảng 1, những ảnh hưởng của trạng thái ngủ đông tùy thuộc vào phiên bản SDK mục tiêu của ứng dụng, cũng như thiết bị mà ứng dụng của bạn đang chạy:

Bảng 1. Ảnh hưởng của trạng thái ngủ đông trên ứng dụng của bạn
Phiên bản SDK mục tiêu Đặc điểm của thiết bị Hiệu ứng ngủ đông
Android 12 trở lên. Chạy Android 12 trở lên

Các quyền khi bắt đầu chạy của ứng dụng sẽ được thiết lập lại. Hành động này có tác dụng tương tự như khi người dùng xem một quyền trong phần cài đặt hệ thống và thay đổi cấp truy cập của ứng dụng thành Từ chối.

Ứng dụng của bạn không thể thực hiện các công việc hoặc cảnh báo từ chế độ nền.

Ứng dụng của bạn không thể nhận thông báo đẩy, bao gồm cả các thông báo có mức độ ưu tiên cao được gửi qua tính năng Gửi thông báo qua đám mây của Firebase.

Mọi tệp trong bộ nhớ đệm của ứng dụng đều bị xoá.

Android 11 Chạy Android 11 Các quyền khi bắt đầu chạy của ứng dụng sẽ được đặt lại.
Android 11 Chạy Android 6.0 (API cấp 23) đến Android 10 (API cấp 29), bao gồm và được cung cấp bởi các Dịch vụ Google Play

Các quyền khi bắt đầu chạy của ứng dụng sẽ được đặt lại.

Hành vi này sẽ có hiệu lực từ tháng 12 năm 2021. Hãy tìm hiểu thêm trong bài đăng trên blog này về cách thiết lập tính năng tự động đặt lại quyền cho hàng tỷ các thiết bị khác.

Hành vi của hệ thống khi một ứng dụng rời khỏi trạng thái ngủ đông

Khi người dùng tương tác lần tiếp theo với ứng dụng của bạn, ứng dụng sẽ thoát khỏi trạng thái ngủ đông và có thể tạo lại các công việc, cảnh báo và thông báo.

Tuy nhiên, hệ thống không thực hiện những việc sau cho ứng dụng của bạn:

  1. Cấp lại quyền khi bắt đầu chạy của ứng dụng.

    Người dùng phải cấp lại các quyền này cho ứng dụng của bạn.

  2. Lên lịch lại cho mọi công việc, cảnh báo và thông báo đã lên lịch trước khi ứng dụng của bạn chuyển sang trạng thái ngủ đông.

    Để hỗ trợ quy trình này dễ dàng hơn, hãy sử dụng công cụ WorkManager. Bạn cũng có thể thêm logic lập lịch lại trong broadcast receiver (trình thu phát sóng) ACTION_BOOT_COMPLETED. Bộ thu này sẽ được gọi khi ứng dụng của bạn rời khỏi trạng thái ngủ đông và sau khi thiết bị khởi động.

Sử dụng ứng dụng

Phần sau đây cung cấp ví dụ về việc sử dụng ứng dụng, cũng như ví dụ về các hành động mà hệ thống không coi là sử dụng ứng dụng.

Ví dụ về việc sử dụng ứng dụng

Khi một hoạt động trong ứng dụng của bạn được tiếp tục, hệ thống sẽ coi sự kiện này là một hoạt động tương tác của người dùng. Do đó, hệ thống sẽ kéo dài khoảng thời gian trước khi ứng dụng của bạn chuyển sang trạng thái ngủ đông.

Trên Android 11 trở lên, các hành vi sau đây cũng được coi là tương tác của người dùng:

  • Người dùng tương tác với một tiện ích.
  • Người dùng tương tác với một thông báo, ngoại trừ việc loại bỏ thông báo.

Xin lưu ý rằng việc sử dụng ứng dụng trong trạng thái ngủ đông không yêu cầu tương tác của người dùng một cách rõ ràng. Miễn là một thành phần của gói được gọi, nó vẫn được coi là hành động sử dụng ứng dụng. Một số ví dụ về điều này bao gồm:

  • Những ứng dụng có dịch vụ hoặc nhà cung cấp nội dung chịu sự ràng buộc của một ứng dụng khác trên thiết bị hoặc hệ điều hành. Chẳng hạn như Trình chỉnh sửa phương thức nhập (IME) hoặc trình quản lý mật khẩu.
  • Các broadcast receiver (trình thu phát sóng) trong gói sẽ nhận được một thông báo rõ ràng từ một gói bên ngoài.

Một ví dụ không liên quan

Nếu ứng dụng của bạn chỉ thể hiện những hành vi được mô tả trong danh sách dưới đây, thì ứng dụng sẽ chuyển sang trạng thái ngủ đông sau vài tháng:

Miễn trừ hệ thống khỏi trạng thái ngủ đông

Android cấp quyền miễn trừ ở trạng thái ngủ đông cho ứng dụng trong một số trường hợp nhất định. Nếu ứng dụng của bạn thuộc một trong những danh mục bên dưới, thì ứng dụng đó sẽ được miễn trừ khỏi các tiêu chuẩn sử dụng ứng dụng và sẽ không bị rơi vào trạng thái ngủ đông.

Ứng dụng không hiển thị trên trình chạy
Bất kỳ ứng dụng nào không có ô phím tắt đang hoạt động trên trình chạy.
Ứng dụng hồ sơ công việc
Bất kỳ ứng dụng nào mà người dùng cài đặt trên hồ sơ công việc. Vui lòng lưu ý nếu ứng dụng tương tự cũng nằm trên hồ sơ cá nhân, thì chỉ ứng dụng hồ sơ công việc mới được miễn trừ.
Trình kiểm soát chính sách thiết bị
Ứng dụng kiểm soát chính sách thiết bị cục bộ và các ứng dụng hệ thống trên thiết bị.
Ứng dụng đặc quyền của nhà cung cấp dịch vụ
Mọi ứng dụng mà nhà cung cấp dịch vụ điện thoại di động tải trước trên thiết bị và cho là cần thiết đối với các nghĩa vụ dịch vụ theo hợp đồng, chẳng hạn như ứng dụng thư thoại hoặc dịch vụ khách hàng.
Ứng dụng trình cài đặt 3p
Cửa hàng ứng dụng của bên thứ ba để tự động cập nhật các ứng dụng đã cài đặt của họ khi cần.

Miễn trừ người dùng khỏi trạng thái ngủ đông

Nếu bạn dự đoán một trường hợp sử dụng chính trong ứng dụng sẽ chịu ảnh hưởng của trạng thái ngủ đông, bạn có thể yêu cầu người dùng miễn trừ trạng thái ngủ đông cho ứng dụng. Việc này rất hữu ích trong những trường hợp mà người dùng muốn ứng dụng của bạn hoạt động chủ yếu ở chế độ nền, ngay cả khi người dùng không tương tác với ứng dụng của bạn, chẳng hạn như khi ứng dụng thực hiện bất kỳ thao tác nào sau đây:

  • Cung cấp thông tin an toàn cho gia đình bằng cách báo cáo định kỳ vị trí của các thành viên trong gia đình.
  • Đồng bộ hóa dữ liệu giữa một thiết bị và máy chủ của ứng dụng.
  • Giao tiếp với các thiết bị thông minh, chẳng hạn như TV.
  • Ghép nối với các thiết bị đồng hành, chẳng hạn như đồng hồ.

Để yêu cầu miễn trừ, hãy hoàn tất các bước trong những phần sau.

Kiểm tra xem người dùng đã tắt trạng thái ngủ đông cho ứng dụng của bạn hay chưa

Để kiểm tra xem người dùng đã tắt trạng thái ngủ đông cho ứng dụng của bạn hay chưa, hãy sử dụng API getUnusedAppRestrictionsStatus().

Để biết thêm thông tin chi tiết về cách sử dụng API này trong ứng dụng của bạn, vui lòng xem ví dụ về mã API trên trang này.

Yêu cầu người dùng tắt trạng thái ngủ đông cho ứng dụng của bạn

Nếu người dùng chưa tắt trạng thái ngủ đông cho ứng dụng, bạn có thể gửi yêu cầu tới người dùng. Để làm vậy, hãy thực hiện các bước sau:

  1. Hiển thị giao diện người dùng để giải thích về lý do họ cần tắt tính năng ngủ đông cho ứng dụng của bạn.
  2. Gọi API createManageUnusedAppRestrictionsIntent() như trong ví dụ về mã API. API này tạo ra một ý định tải màn hình Thông tin ứng dụng trong phần Cài đặt. Từ đây, người dùng có thể tắt trạng thái ngủ đông cho ứng dụng của bạn.

    Điều quan trọng là bạn phải gọi startActivityForResult() chứ không phải startActivity() khi gửi ý định này.

    Như trong bảng 2, vị trí và tên của tuỳ chọn phụ thuộc vào các đặc điểm của thiết bị đã cài đặt ứng dụng của bạn:

    Bảng 2. Tùy chọn vô hiệu hóa trạng thái ngủ đông cho ứng dụng của bạn
    Đặc điểm của thiết bị Trang mà tùy chọn xuất hiện Tên của tuỳ chọn tắt
    Chạy Android 13 trở lên Thông tin ứng dụng Tạm dừng hoạt động trong ứng dụng nếu không dùng
    Chạy Android 12 Thông tin ứng dụng Xóa quyền và giải phóng dung lượng
    Chạy Android 11 Thông tin ứng dụng > Quyền Thu hồi quyền nếu bạn không dùng ứng dụng
    Chạy Android 6.0 đến Android 10, bao gồm và được cung cấp bởi Dịch vụ Google Play Ứng dụng Play > Trình đơn > Play Protect > Quyền cho các ứng dụng không dùng đến Thu hồi quyền nếu bạn không dùng ứng dụng

Ví dụ về mã API

Ví dụ về mã này cho biết cách kiểm tra xem trạng thái ngủ đông có được bật cho ứng dụng của bạn hay không và cách chính xác để yêu cầu người dùng tắt trạng thái ngủ đông cho ứng dụng của bạn.

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API nền tảng cũ

Hệ điều hành cũng bao gồm một API để tương tác với tính năng ngủ đông. Tuy nhiên, API chỉ hoạt động trên các thiết bị chạy Android 11 trở lên; API không xử lý các tính năng ngủ đông được hỗ trợ điều chỉnh cho các phiên bản Android trước đó. Do đó, bạn không nên sử dụng API này.

Nếu tạm thời, bạn cần tiếp tục sử dụng API này cho mục đích tương thích, danh sách sau đây sẽ hướng dẫn bạn cách sử dụng:

Gọi hành vi ngủ đông theo cách thủ công

Để kiểm tra cách ứng dụng của bạn hoạt động sau khi hệ thống đặt ứng dụng vào trạng thái ngủ đông, hãy hoàn thành các bước sau:

  1. (Chỉ dành cho Android 12 trở lên) Bật tính năng ngủ đông trên thiết bị của bạn:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Đặt khoảng thời gian mặc định mà hệ thống chờ để chuyển sang trạng thái ngủ đông. Theo đó, bạn có thể khôi phục trạng thái sau khi thử nghiệm:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Giảm thời gian chờ đợi của hệ thống. Trong ví dụ sau, hệ thống được sửa đổi để ứng dụng của bạn chỉ ở trạng thái ngủ đông một giây sau khi bạn ngừng tương tác với ứng dụng:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Chờ mọi thông báo trong thời gian khởi động kết thúc trên thiết bị thử nghiệm bằng cách chạy lệnh sau:

    adb shell am wait-for-broadcast-idle
    

    Khi đã phát xong thông báo, lệnh này sẽ trả về thông báo: All broadcast queues are idle!

  5. Gọi quy trình ngủ đông của ứng dụng theo cách thủ công:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Chỉ dành cho Android 12 trở lên) Xác nhận là ứng dụng đã ở trạng thái ngủ đông bằng một trong các phương thức sau:

    • Bạn quan sát sẽ thấy thiết bị thử nghiệm hiện hiển thị thông báo cho biết các ứng dụng không dùng đến đã ở trạng thái ngủ đông.
    • Chạy lệnh sau:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Khôi phục khoảng thời gian mặc định mà hệ thống chờ trước khi đặt ứng dụng của bạn vào trạng thái ngủ đông:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold