Bộ chứa chế độ chờ ứng dụng

Android 9 (API cấp 28) trở lên hỗ trợ Bộ chứa ở chế độ chờ ứng dụng. Bộ chứa chế độ chờ của ứng dụng giúp hệ thống ưu tiên các yêu cầu của ứng dụng về tài nguyên, dựa trên mức sử dụng gần đây và tần suất sử dụng ứng dụng. Dựa trên mẫu sử dụng ứng dụng, mỗi ứng dụng sẽ được đưa vào một trong năm bộ chứa ưu tiên. Hệ thống sẽ giới hạn các tài nguyên thiết bị có sẵn cho mỗi ứng dụng dựa trên bộ chứa chứa ứng dụng đó.

Bộ chứa ưu tiên

Hệ thống sẽ linh hoạt chỉ định từng ứng dụng cho một bộ chứa ưu tiên, rồi chỉ định lại các ứng dụng đó khi cần. Hệ thống này có thể triển khai một ứng dụng tải trước dùng công nghệ học máy để xác định khả năng mỗi ứng dụng được dùng và chỉ định ứng dụng cho bộ chứa thích hợp. Nếu không có ứng dụng hệ thống trên thiết bị, thì theo mặc định, hệ thống sẽ sắp xếp ứng dụng dựa trên mức sử dụng ứng dụng. Các ứng dụng hoạt động nhiều hơn được chỉ định cho những bộ chứa ưu tiên ứng dụng hơn, nhờ đó, ứng dụng có thể dùng nhiều tài nguyên hệ thống hơn. Cụ thể là bộ chứa này xác định tần suất chạy công việc của ứng dụng và tần suất ứng dụng có thể kích hoạt chuông báo. Những hạn chế này chỉ áp dụng khi thiết bị đang chạy bằng pin. Hệ thống không áp dụng các hạn chế này đối với ứng dụng trong khi thiết bị đang sạc.

Lưu ý: Nhà sản xuất nào cũng có thể đặt các tiêu chí riêng cho cách các ứng dụng không hoạt động được chỉ định cho các bộ chứa. Bạn không nên cố gắng tác động đến bộ chứa ứng dụng được chỉ định. Thay vào đó, hãy tập trung vào việc đảm bảo ứng dụng của bạn hoạt động hiệu quả trong mọi bộ chứa ứng dụng. Ứng dụng của bạn có thể tìm ra bộ chứa hiện tại bằng cách gọi UsageStatsManager.getAppStandbyBucket().

Các bộ chứa này bao gồm:

  1. Đang hoạt động: Ứng dụng hiện đang được sử dụng hoặc đã được sử dụng gần đây.
  2. Nhóm hoạt động: Ứng dụng đang sử dụng thông thường.
  3. Thường xuyên: Ứng dụng thường được sử dụng, nhưng không phải mỗi ngày.
  4. Hiếm gặp: Ứng dụng không được sử dụng thường xuyên.
  5. Bị hạn chế: Ứng dụng tiêu tốn nhiều tài nguyên của hệ thống, hoặc có thể có hành vi không mong muốn.

Ngoài ra, có một bộ chứa đặc biệt với chế độ là không bao giờ, chỉ dành cho các ứng dụng đã được cài đặt nhưng chưa bao giờ được chạy. Hệ thống áp dụng các quy định hạn chế nghiêm ngặt đối với những ứng dụng này.

Lưu ý: Các ứng dụng nằm trong danh sách miễn trừ Nghỉ sẽ được miễn khỏi các hạn chế dựa trên bộ chứa chế độ chờ của ứng dụng.

Lưu ý: Phần mô tả bên dưới là dành cho trường hợp không dự đoán được. Ngược lại, khi công cụ dự đoán sử dụng công nghệ học máy để dự đoán hành vi, bộ chứa sẽ được chọn để dự đoán hành động tiếp theo của người dùng chứ không phải dựa trên mức sử dụng gần đây. Ví dụ: một ứng dụng bạn dùng gần đây có thể trở thành bộ chứa hiếm, vì công nghệ học máy dự đoán bạn sẽ không dùng ứng dụng đó trong vài giờ.

Đang hoạt động

Một ứng dụng sẽ nằm trong bộ chứa đang hoạt động nếu người dùng hiện đang sử dụng ứng dụng hoặc mới sử dụng ứng dụng gần đây. Ví dụ:

  • Ứng dụng đã ra mắt một hoạt động
  • Ứng dụng của bạn đang chạy một dịch vụ trên nền trước.
  • Ứng dụng này có một bộ điều hợp đồng bộ hoá liên kết với một nhà cung cấp nội dung mà một ứng dụng trên nền trước sử dụng
  • Người dùng nhấp vào một thông báo trong ứng dụng

Nếu một ứng dụng nằm trong bộ chứa đang hoạt động, thì hệ thống không đặt ra bất kỳ hạn chế nào đối với công việc hoặc chuông báo của ứng dụng đó.

Tương tác của người dùng đặt các ứng dụng vào bộ chứa "đang hoạt động"

Trên Android 9 (API cấp 28) trở lên, khi người dùng tương tác với ứng dụng của bạn theo những cách nhất định, hệ thống sẽ tạm thời đặt ứng dụng đó vào bộ chứa đang hoạt động. Sau khi người dùng ngừng tương tác với ứng dụng được một thời gian, hệ thống sẽ đặt ứng dụng đó vào một bộ chứa dựa trên nhật ký sử dụng.

Dưới đây là ví dụ về các tương tác kích hoạt hành vi này của hệ thống:

  • Người dùng nhấn vào thông báo do ứng dụng gửi.

  • Người dùng tương tác với dịch vụ trên nền trước trong ứng dụng bằng cách nhấn vào nút nội dung đa phương tiện.

  • Người dùng vừa kết nối với ứng dụng vừa tương tác với Android Automotive OS, khi đó ứng dụng dùng dịch vụ trên nền trước hoặc CONNECTION_TYPE_PROJECTION.

Hoạt động

Một ứng dụng sẽ nằm trong bộ chứa hoạt động nếu ứng dụng đó chạy thường xuyên nhưng hiện không hoạt động. Ví dụ: một ứng dụng mạng xã hội mà người dùng chạy hầu hết các ngày có khả năng đang hoạt động. Các ứng dụng cũng được thăng cấp vào bộ chứa hoạt động nếu chúng được sử dụng gián tiếp.

Nếu một ứng dụng đang hoạt động, hệ thống sẽ đặt ra các hạn chế nhỏ về khả năng chạy các công việc và kích hoạt chuông báo. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Thường xuyên

Một ứng dụng nằm trong bộ chứa thường xuyên nếu được sử dụng thường xuyên, nhưng không nhất thiết phải mỗi ngày. Ví dụ: một ứng dụng theo dõi bài tập thể dục mà người dùng chạy tại phòng tập thể dục có thể nằm trong bộ chứa thường xuyên.

Nếu một ứng dụng nằm trong bộ chứa thường xuyên, thì hệ thống sẽ áp dụng các hạn chế nghiêm ngặt hơn đối với khả năng chạy công việc và kích hoạt chuông báo. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Hiếm

Một ứng dụng nằm trong bộ chứa hiếm nếu ứng dụng không thường xuyên được sử dụng. Ví dụ: một ứng dụng khách sạn mà người dùng chỉ chạy trong khi ở tại khách sạn đó có thể nằm trong bộ chứa hiếm.

Nếu một ứng dụng nằm trong bộ chứa hiếm, thì hệ thống sẽ áp dụng các hạn chế nghiêm ngặt đối với khả năng chạy công việc và kích hoạt chuông báo. Hệ thống cũng giới hạn khả năng kết nối Internet của ứng dụng. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Bị hạn chế

Bộ chứa này được thêm vào Android 12 (API cấp 31), có mức độ ưu tiên thấp nhất (và các hạn chế cao nhất) trong tất cả các bộ chứa. Hệ thống sẽ xem xét hành vi của ứng dụng, chẳng hạn như tần suất người dùng tương tác với ứng dụng, để quyết định xem có đặt ứng dụng đó vào bộ chứa bị hạn chế hay không.

Trên Android 13 (API cấp 33) trở lên, trừ phi ứng dụng đủ điều kiện được miễn, hệ thống sẽ đặt ứng dụng vào bộ chứa bị hạn chế trong những trường hợp sau đây:

  • Người dùng không tương tác với ứng dụng của bạn trong một số ngày cụ thể. Trên Android 12 (API cấp 31) và 12L (API cấp 32), số ngày là 45. Android 13 giảm mức này xuống còn 8 ngày.

  • Ứng dụng gọi quá nhiều thông báo hoặc liên kết trong vòng 24 giờ.

Nếu hệ thống đặt ứng dụng vào bộ chứa bị hạn chế, thì các hạn chế sau đây sẽ áp dụng:

  • Bạn có thể chạy công việc mỗi ngày một lần, trong một phiên hoạt động kéo dài 10 phút. Trong phiên này, hệ thống nhóm các công việc của ứng dụng với các công việc của ứng dụng khác.
    • Các công việc bị hạn chế không có khả năng tự chạy – phải có ít nhất một công việc khác đang chạy/đang chờ xử lý cùng lúc, có thể bao gồm bất kỳ công việc nào khác.
  • Ứng dụng của bạn có thể chạy nhiều công việc nhanh hơn, so với khi hệ thống đặt ứng dụng của bạn vào một bộ chứa ít hạn chế hơn.
  • Ứng dụng của bạn có thể gọi một chuông báo mỗi ngày. Chuông báo này có thể là chuông báo chính xác hoặc chuông báo không chính xác.

Miễn khỏi bộ chứa bị hạn chế

Sau đây là những loại ứng dụng được miễn khỏi Bộ chứa chế độ chờ ứng dụng "bị hạn chế" và bỏ qua trình kích hoạt khi không có hoạt động, ngay cả trên Android 12 trở lên:

Các phương pháp hay nhất

Nếu ứng dụng của bạn đã tuân thủ các phương pháp hay nhất cho chế độ Nghỉ và chế độ chờ ứng dụng, thì việc xử lý các tính năng quản lý nguồn mới sẽ không hề khó khăn. Tuy nhiên, một số hành vi ứng dụng trước đây hoạt động tốt giờ có thể gây ra sự cố.

  • Đừng cố gắng thao túng hệ thống để đưa ứng dụng của bạn vào một bộ chứa nào đó. Các phương pháp phân bộ chứa của hệ thống có thể thay đổi và mọi nhà sản xuất thiết bị đều có thể chọn viết ứng dụng phân bộ chứa bằng thuật toán riêng. Thay vào đó, hãy đảm bảo ứng dụng của bạn hoạt động theo cách phù hợp dù thuộc bộ chứa nào.
  • Nếu một ứng dụng không có hoạt động trong trình chạy, thì ứng dụng đó có thể không bao giờ được nâng cấp lên bộ chứa đang hoạt động. Bạn nên thiết kế lại ứng dụng của mình để có hoạt động như vậy.
  • Nếu không thể xử lý thông báo của ứng dụng, người dùng sẽ không thể kích hoạt chương trình khuyến mãi của ứng dụng vào bộ chứa đang hoạt động bằng cách tương tác với thông báo. Trong trường hợp này, bạn nên thiết kế lại một số thông báo thích hợp để người dùng có thể phản hồi. Để biết thêm về các nguyên tắc, vui lòng xem phần Mẫu thiết kế thông báo cho Material Design.
  • Tương tự, nếu ứng dụng không hiển thị thông báo khi nhận được thông báo có mức độ ưu tiên cao được gửi bằng Giải pháp gửi thông báo qua đám mây của Firebase (FCM), thì người dùng sẽ không có cơ hội tương tác với ứng dụng đó và vì vậy, ứng dụng sẽ được thăng cấp lên bộ chứa đang hoạt động. Trên thực tế, mục đích duy nhất của thông báo FCM có mức độ ưu tiên cao là gửi thông báo cho người dùng nên trường hợp này không nên xảy ra. Trên 12L (API cấp 32) trở xuống, nếu bạn đánh dấu nhầm một thông báo FCM là có mức độ ưu tiên cao dù thông báo này không kích hoạt tương tác của người dùng, thì việc đó có thể khiến các thông báo trong tương lai không được ưu tiên.

    Lưu ý: Nếu người dùng đóng một thông báo nhiều lần, thì hệ thống sẽ cung cấp cho người dùng lựa chọn chặn thông báo đó trong tương lai. Đừng gửi thông báo cho người dùng chỉ với mục đích cố gắng giữ cho ứng dụng của bạn trong bộ chứa đang hoạt động!

  • Nếu ứng dụng được chia thành nhiều gói, thì các gói đó có thể nằm trong những bộ chứa khác nhau nên sẽ có các cấp truy cập khác nhau. Bạn nên đảm bảo kiểm tra các ứng dụng như vậy với các gói được chỉ định cho nhiều bộ chứa để đảm bảo ứng dụng hoạt động đúng cách.

Thử nghiệm

Để kiểm tra xem ứng dụng của bạn được đặt vào bộ chứa nào, hãy làm theo một trong những cách sau đây:

  • Gọi getAppStandbyBucket().
  • Chạy lệnh sau đây trong một cửa sổ dòng lệnh khác:

    adb shell am get-standby-bucket PACKAGE_NAME

Hệ thống sẽ điều tiết ứng dụng của bạn mỗi khi ứng dụng đó được đưa vào một Bộ chứa ứng dụng ở chế độ chờ có giá trị lớn hơn STANDBY_BUCKET_ACTIVE (10).