Tối ưu hoá cho chế độ Nghỉ và chế độ Chờ ứng dụng

Android có 2 tính năng tiết kiệm pin giúp kéo dài thời lượng pin cho người dùng bằng cách quản lý cách hoạt động của ứng dụng khi thiết bị không được kết nối với nguồn điện: Chế độ nghỉ và Chế độ chờ ứng dụng. Chế độ nghỉ giúp giảm mức tiêu thụ pin bằng cách trì hoãn CPU và hoạt động mạng ở chế độ nền cho các ứng dụng khi không sử dụng thiết bị trong một thời gian dài. Chế độ chờ ứng dụng trì hoãn hoạt động mạng trong nền đối với những ứng dụng không có hoạt động gần đây của người dùng.

Khi thiết bị đang ở chế độ Nghỉ, quyền truy cập của các ứng dụng vào một số tài nguyên tiêu tốn nhiều pin sẽ bị trì hoãn cho đến thời gian bảo trì. Các hạn chế cụ thể được liệt kê trong phần Hạn chế quản lý nguồn.

Chế độ Nghỉ và Chế độ chờ ứng dụng quản lý hành vi của tất cả ứng dụng chạy trên Android 6.0 trở lên, bất kể các ứng dụng đó có nhắm mục tiêu cụ thể đến API cấp 23 hay không. Để giúp đảm bảo người dùng có trải nghiệm tốt nhất, hãy kiểm thử ứng dụng của bạn ở chế độ Nghỉ và Chế độ chờ ứng dụng, đồng thời thực hiện mọi điều chỉnh cần thiết đối với mã. Các phần sau đây sẽ cung cấp thông tin chi tiết.

Tìm hiểu về chế độ nghỉ

Nếu người dùng không cắm thiết bị vào nguồn điện và đứng yên trong một khoảng thời gian sau khi màn hình tắt, thiết bị sẽ chuyển sang chế độ Nghỉ. Ở chế độ Nghỉ, hệ thống cố gắng tiết kiệm pin bằng cách hạn chế quyền truy cập của ứng dụng vào các dịch vụ dùng nhiều mạng và CPU. Thư viện này cũng ngăn các ứng dụng truy cập mạng và trì hoãn công việc, đồng bộ hoá và chuông báo tiêu chuẩn của chúng.

Theo định kỳ, hệ thống thoát khỏi chế độ Nghỉ trong một thời gian ngắn để cho phép các ứng dụng hoàn tất các hoạt động bị trì hoãn. Trong cửa sổ bảo trì này, hệ thống sẽ chạy tất cả các công việc, chuông báo và đồng bộ hoá đang chờ xử lý, đồng thời cho phép các ứng dụng truy cập vào mạng.

Hình 1. Chế độ Nghỉ cung cấp một khoảng thời gian bảo trì định kỳ để các ứng dụng dùng mạng và xử lý các hoạt động đang chờ xử lý.

Khi thời gian bảo trì kết thúc, hệ thống lại chuyển sang chế độ Nghỉ, tạm ngưng quyền truy cập mạng và trì hoãn công việc, đồng bộ hoá và chuông báo. Theo thời gian, hệ thống lên lịch bảo trì ít thường xuyên hơn, giúp giảm mức tiêu thụ pin trong trường hợp không hoạt động trong thời gian dài hơn khi thiết bị đang không sạc.

Khi người dùng đánh thức thiết bị bằng cách di chuyển thiết bị, bật màn hình hoặc kết nối bộ sạc, hệ thống sẽ thoát khỏi chế độ Nghỉ và tất cả các ứng dụng sẽ tiếp tục hoạt động bình thường.

Hạn chế đối với chế độ nghỉ

Hệ thống sẽ áp dụng các hạn chế sau đây cho các ứng dụng của bạn khi ở chế độ Nghỉ:

Danh sách kiểm tra chế độ nghỉ

Điều chỉnh ứng dụng cho phù hợp với chế độ Nghỉ

Chế độ Nghỉ có thể ảnh hưởng đến các ứng dụng theo nhiều cách, tuỳ thuộc vào chức năng của các ứng dụng đó và dịch vụ mà các ứng dụng đó sử dụng. Nhiều ứng dụng hoạt động bình thường trên các chu kỳ Nghỉ mà không cần sửa đổi. Trong một số trường hợp, bạn phải tối ưu hoá cách ứng dụng quản lý mạng, chuông báo, công việc và đồng bộ hoá. Ứng dụng phải có khả năng quản lý hoạt động một cách hiệu quả trong mỗi thời gian bảo trì.

Để giúp lên lịch chuông báo, bạn có thể sử dụng 2 phương thức AlarmManager: setAndAllowWhileIdle()setExactAndAllowWhileIdle(). Với các phương thức này, bạn có thể đặt chuông báo sẽ kích hoạt ngay cả khi thiết bị đang ở chế độ Nghỉ.

Việc hạn chế chế độ Nghỉ đối với quyền truy cập mạng cũng có thể ảnh hưởng đến ứng dụng của bạn, đặc biệt nếu ứng dụng dựa vào các thông báo theo thời gian thực, chẳng hạn như kim đánh dấu nhịp độ khung hình hoặc thông báo. Nếu ứng dụng của bạn yêu cầu kết nối mạng liên tục để nhận tin nhắn, hãy sử dụng Giải pháp gửi thông báo qua đám mây của Firebase (FCM) nếu có thể.

Để xác nhận ứng dụng hoạt động như dự kiến với chế độ Nghỉ, bạn có thể dùng các lệnh adb để buộc hệ thống truy cập và thoát khỏi chế độ Nghỉ, đồng thời quan sát hành vi của ứng dụng. Để biết thông tin chi tiết, vui lòng xem phần Kiểm thử với Chế độ nghỉ và Chế độ chờ ứng dụng.

Tìm hiểu về Chế độ chờ ứng dụng

Chế độ chờ ứng dụng cho phép hệ thống xác định rằng một ứng dụng ở trạng thái rảnh khi người dùng hiện không sử dụng ứng dụng đó. Hệ thống sẽ xác định việc này khi người dùng không chạm vào ứng dụng trong một khoảng thời gian nhất định và không áp dụng điều kiện nào sau đây:

  • Người dùng khởi chạy ứng dụng một cách rõ ràng.
  • Ứng dụng có một quy trình đang chạy ở nền trước, dưới dạng một hoạt động/dịch vụ trên nền trước, hoặc đang được một hoạt động khác/dịch vụ trên nền trước sử dụng.
  • Ứng dụng tạo một thông báo mà người dùng nhìn thấy trên màn hình khoá hoặc trong khay thông báo.

Khi người dùng cắm thiết bị vào nguồn điện, hệ thống sẽ giải phóng các ứng dụng khỏi trạng thái chờ, cho phép các ứng dụng tự do truy cập vào mạng cũng như thực thi mọi công việc đang chờ xử lý và đồng bộ hoá. Nếu thiết bị không hoạt động trong thời gian dài, hệ thống sẽ cho phép các ứng dụng ở trạng thái rảnh truy cập vào mạng khoảng một lần mỗi ngày.

Sử dụng FCM để tương tác với ứng dụng của bạn khi thiết bị ở trạng thái rảnh

Giải pháp gửi thông báo qua đám mây của Firebase (FCM) là dịch vụ từ đám mây đến thiết bị, cho phép bạn hỗ trợ thông báo xuôi dòng theo thời gian thực giữa các dịch vụ phụ trợ và ứng dụng trên thiết bị Android. FCM cung cấp kết nối duy nhất, liên tục với đám mây. Tất cả các ứng dụng cần nhắn tin theo thời gian thực đều có thể chia sẻ kết nối này. Kết nối dùng chung này giúp tối ưu hoá mức tiêu thụ pin một cách đáng kể, khiến nhiều ứng dụng không cần phải duy trì các kết nối riêng biệt, liên tục của riêng chúng, điều này có thể làm pin nhanh hết. Vì lý do này, nếu ứng dụng của bạn yêu cầu tích hợp nhắn tin với dịch vụ phụ trợ, bạn nên sử dụng FCM nếu có thể, thay vì duy trì kết nối mạng liên tục của riêng bạn.

FCM được tối ưu hóa để hoạt động với chế độ Nghỉ và Chế độ chờ ứng dụng. Thông báo có mức độ ưu tiên cao bằng FCM cho phép bạn đánh thức ứng dụng để tương tác với người dùng. Ở chế độ Nghỉ hoặc Chế độ chờ ứng dụng, hệ thống sẽ gửi thông báo và cho phép ứng dụng truy cập tạm thời vào các dịch vụ mạng và khoá chế độ thức một phần, sau đó đưa thiết bị hoặc ứng dụng về trạng thái rảnh. Đối với các thông báo có giới hạn thời gian mà người dùng nhìn thấy, hãy cân nhắc sử dụng các thông báo có mức độ ưu tiên cao để cho phép gửi ở chế độ Nghỉ. Thông báo có mức độ ưu tiên cao có thể dẫn đến thông báo. Hãy xem hướng dẫn của FCM về các thông báo có mức độ ưu tiên cao để biết thêm thông tin.

Đối với các thông báo không dẫn đến thông báo, chẳng hạn như luôn cập nhật nội dung ứng dụng ở chế độ nền hoặc bắt đầu đồng bộ hoá dữ liệu, hãy sử dụng các thông báo FCM có mức độ ưu tiên thông thường. Các tin nhắn có mức độ ưu tiên bình thường sẽ được gửi ngay lập tức nếu thiết bị không ở chế độ Nghỉ. Nếu thiết bị ở Chế độ nghỉ, các thiết bị sẽ được phân phối trong thời gian bảo trì Chế độ nghỉ định kỳ hoặc ngay khi người dùng đánh thức thiết bị.

Phương pháp chung hay nhất là nếu ứng dụng của bạn yêu cầu thông điệp truyền xuống, hãy sử dụng FCM. Nếu ứng dụng của bạn đã sử dụng FCM, hãy đảm bảo rằng ứng dụng chỉ sử dụng các tin nhắn có mức độ ưu tiên cao cho các tin nhắn dẫn đến thông báo mà người dùng nhìn thấy.

Hỗ trợ các trường hợp sử dụng khác

Hầu hết các ứng dụng đều có thể hỗ trợ chế độ Nghỉ bằng cách quản lý kết nối mạng, chuông báo, công việc và hoạt động đồng bộ hoá cũng như bằng cách sử dụng thông báo FCM. Đối với một nhóm trường hợp sử dụng hẹp, điều này có thể là chưa đủ. Đối với những trường hợp như vậy, hệ thống cung cấp một danh sách có thể định cấu hình những ứng dụng được miễn một phần khỏi tính năng tối ưu hoá Chế độ nghỉ và Chế độ chờ ứng dụng.

Ứng dụng được miễn trừ một phần có thể sử dụng mạng và giữ khoá chế độ thức một phần trong chế độ Nghỉ và Chế độ chờ ứng dụng. Tuy nhiên, các hạn chế khác vẫn áp dụng cho ứng dụng, giống như các ứng dụng khác. Ví dụ: các công việc và quá trình đồng bộ hoá của ứng dụng sẽ bị trì hoãn ở API cấp 23 trở xuống, đồng thời các chuông báo AlarmManager thông thường của ứng dụng sẽ không kích hoạt. Ứng dụng có thể kiểm tra xem ứng dụng hiện có nằm trong danh sách miễn trừ hay không bằng cách gọi isIgnoringBatteryOptimizations().

Người dùng có thể định cấu hình danh sách các ứng dụng được miễn trừ theo cách thủ công trong phần Cài đặt > Pin > Tối ưu hoá pin. Ngoài ra, hệ thống cung cấp nhiều cách để yêu cầu người dùng miễn trừ ứng dụng:

Ứng dụng có thể kiểm tra xem ứng dụng đó hiện có nằm trong danh sách miễn trừ hay không bằng cách gọi isIgnoringBatteryOptimizations().

Kiểm thử với Chế độ nghỉ và Chế độ chờ ứng dụng

Để giúp đảm bảo người dùng có trải nghiệm chất lượng cao, hãy kiểm thử ứng dụng của bạn đầy đủ ở chế độ Nghỉ và Chế độ chờ ứng dụng.

Kiểm thử ứng dụng bằng chế độ Nghỉ

Bạn có thể kiểm thử chế độ Nghỉ bằng cách làm như sau:

  1. Định cấu hình thiết bị phần cứng hoặc thiết bị ảo có ảnh hệ thống Android 6.0 (API cấp 23) trở lên.
  2. Kết nối thiết bị với máy phát triển và cài đặt ứng dụng.
  3. Chạy ứng dụng và để ứng dụng ở trạng thái hoạt động.
  4. Buộc hệ thống chuyển sang chế độ rảnh bằng cách chạy lệnh sau:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Khi đã sẵn sàng, hãy thoát khỏi chế độ không hoạt động bằng cách chạy lệnh sau:
        $ adb shell dumpsys deviceidle unforce
        
  6. Kích hoạt lại thiết bị bằng cách thực hiện lệnh sau:
        $ adb shell dumpsys battery reset
        
  7. Quan sát hành vi của ứng dụng sau khi bạn kích hoạt lại thiết bị. Hãy đảm bảo ứng dụng khôi phục linh hoạt khi thiết bị thoát khỏi chế độ Nghỉ.

Kiểm thử ứng dụng bằng Chế độ chờ ứng dụng

Để kiểm thử Chế độ chờ ứng dụng với ứng dụng, hãy làm như sau:

  1. Định cấu hình thiết bị phần cứng hoặc thiết bị ảo có ảnh hệ thống Android 6.0 (API cấp 23) trở lên.
  2. Kết nối thiết bị với máy phát triển và cài đặt ứng dụng.
  3. Chạy ứng dụng và để ứng dụng ở trạng thái hoạt động.
  4. Buộc ứng dụng chuyển sang chế độ Chế độ chờ ứng dụng bằng cách chạy các lệnh sau:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Mô phỏng thao tác đánh thức ứng dụng bằng các lệnh sau:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Quan sát hành vi của ứng dụng sau khi đánh thức ứng dụng đó. Đảm bảo ứng dụng khôi phục linh hoạt từ chế độ chờ. Cụ thể, hãy kiểm tra xem các thông báo và công việc trong nền của ứng dụng có hoạt động như dự kiến hay không.

Các trường hợp được miễn trừ

Bảng sau đây nêu bật một số trường hợp sử dụng và liệu ứng dụng có được phép sử dụng thao tác theo ý định ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS trong các trường hợp như vậy hay không. Nhìn chung, ứng dụng của bạn không đáp ứng các ngoại lệ này trừ phi chế độ Nghỉ hoặc Chế độ chờ ứng dụng làm hỏng chức năng cốt lõi của ứng dụng hoặc có lý do kỹ thuật khiến ứng dụng của bạn không thể sử dụng các thông báo có mức độ ưu tiên cao của FCM.

Để biết thêm thông tin, hãy xem phần Hỗ trợ các trường hợp sử dụng khác.

Loại Trường hợp sử dụng Có thể sử dụng FCM không? Miễn chấp nhận được? Ghi chú
Ứng dụng nhắn tin tức thì, trò chuyện hoặc gọi điện. Yêu cầu gửi thông báo theo thời gian thực cho người dùng khi thiết bị đang ở Chế độ nghỉ hoặc ứng dụng đang ở Chế độ chờ ứng dụng. Có, đang sử dụng FCM Không được chấp nhận Sử dụng tin nhắn có mức độ ưu tiên cao của FCM để đánh thức ứng dụng và truy cập vào mạng.
Có, nhưng hiện không sử dụng tin nhắn có mức độ ưu tiên cao của FCM.
Ứng dụng nhắn tin tức thì, trò chuyện hoặc gọi điện; các ứng dụng VOIP dành cho doanh nghiệp. Không, không thể sử dụng FCM do sự phụ thuộc kỹ thuật vào một dịch vụ nhắn tin khác hoặc chế độ Nghỉ và Chế độ chờ ứng dụng làm hỏng chức năng cốt lõi của ứng dụng. Chấp nhận được
Ứng dụng An toàn. Ứng dụng giữ an toàn cho người dùng và gia đình họ. (nếu có). Chấp nhận được
Ứng dụng tự động hoá công việc. Chức năng cốt lõi của ứng dụng là lên lịch cho các thao tác tự động, chẳng hạn như nhắn tin nhanh, gọi thoại hoặc quản lý ảnh mới. (nếu có). Chấp nhận được
Ứng dụng đồng hành với thiết bị ngoại vi. Chức năng cốt lõi của ứng dụng là duy trì kết nối liên tục với thiết bị ngoại vi nhằm mục đích cấp quyền truy cập Internet cho thiết bị ngoại vi. (nếu có). Chấp nhận được
Ứng dụng chỉ cần định kỳ kết nối với thiết bị ngoại vi để đồng bộ hoá hoặc chỉ cần kết nối với các thiết bị (chẳng hạn như tai nghe không dây) được kết nối qua cấu hình Bluetooth tiêu chuẩn. (nếu có). Không được chấp nhận