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 các ứng dụng khi thiết bị không kết nối với nguồn điện: 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 hoạt động mạng và CPU trong nền cho các ứng dụng khi thiết bị không được sử dụng trong thời gian dài. Chế độ Chờ ứng dụng trì hoãn hoạt động mạng ở chế độ nền cho các ứng dụng không có hoạt động gần đây của người dùng.

Khi thiết bị ở chế độ Nghỉ, quyền truy cập của các ứng dụng vào một số tài nguyên 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ế độ Ngủ 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 đến API cấp 23 hay không. Để giúp đảm bảo trải nghiệm tốt nhất cho người dùng, hãy kiểm thử ứng dụng của bạn ở chế độ Nghỉ và Chế độ chờ ứng dụng, cũng như thực hiện mọi điều chỉnh cần thiết đối với mã của bạn. Các phần sau đây cung cấp thông tin chi tiết.

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

Nếu người dùng rút phích cắm và để thiết bị đứng yên trong một khoảng thời gian, với màn hình tắt, thì thiết bị sẽ chuyển sang Chế độ nghỉ. Ở chế độ Nghỉ, hệ thống sẽ 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 mạng và các dịch vụ dùng nhiều CPU. Chế độ này cũng ngăn các ứng dụng truy cập vào mạng và trì hoãn các công việc, hoạt động đồng bộ hoá và chuông báo tiêu chuẩn.

Theo định kỳ, hệ thống sẽ thoát khỏi chế độ Nghỉ trong một khoảng 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 khoảng thời gian bảo trì này, hệ thống sẽ chạy tất cả các lượt đồng bộ hoá, công việc và chuông báo đ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ế độ Ngủ cung cấp một khoảng thời gian bảo trì định kỳ để các ứng dụng sử 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 sẽ 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 sẽ giảm tần suất lên lịch bảo trì, giúp giảm mức tiêu thụ pin trong trường hợp thiết bị không hoạt động trong thời gian dài.

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ế về chế độ Nghỉ

Hệ thống á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 của bạn cho phù hợp với chế độ Nghỉ

Chế độ Ngủ có thể ảnh hưởng đến các ứng dụng theo nhiều cách, tuỳ thuộc vào các tính năng mà ứng dụng cung cấp và các dịch vụ mà ứng dụng sử dụng. Nhiều ứng dụng hoạt động bình thường trong 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à quá trình đồng bộ hoá. Ứng dụng phải có khả năng quản lý các hoạt động một cách hiệu quả trong mỗi thời gian bảo trì.

Để lên lịch chuông báo, bạn có thể sử dụng hai 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ị ở chế độ Ngủ.

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 là khi ứng dụng dựa vào 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 liên tục với mạng để 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 rằng ứng dụng của bạn hoạt động như mong đợi với chế độ Nghỉ, bạn có thể sử dụng các lệnh adb để buộc hệ thống vào và thoát khỏi chế độ Nghỉ cũng như quan sát hành vi của ứng dụng. Để biết thông tin chi tiết, hãy xem phần Kiểm thử bằng 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 đang ở trạng thái rảnh khi người dùng không chủ động sử dụng ứng dụng đó. Hệ thống đưa ra xác định 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 có điều kiện nào sau đây áp dụng:

  • 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 hiện đang ở nền trước, dưới dạng một hoạt động hoặc dịch vụ trên nền trước, hoặc đang được một hoạt động hoặc dịch vụ trên nền trước khác sử dụng.
  • Ứng dụng sẽ 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 và thực thi mọi công việc và hoạt động đồng bộ hoá đang chờ xử lý. 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 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à một dịch vụ từ đám mây đến thiết bị, cho phép bạn hỗ trợ tính năng nhắn tin 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 một kết nối duy nhất, liên tục đến đám mây. Tất cả ứng dụng cần giao tiếp 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 tối ưu hoá đáng kể mức tiêu thụ pin bằng cách giúp 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 mình. Điều này có thể làm cạn kiệt pin nhanh chóng. Vì lý do này, nếu ứng dụng của bạn yêu cầu tích hợp tính năng nhắn tin với một 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 mình.

FCM được tối ưu hoá để hoạt động với các chế độ Nghỉ và Chế độ chờ ứng dụng ở trạng thái rảnh. Thông báo có mức độ ưu tiên cao FCM cho phép bạn đánh thức ứng dụng của mình để thu hút người dùng. Ở chế độ Nghỉ hoặc Chế độ chờ ứng dụng, hệ thống sẽ gửi thông báo và cấp cho ứng dụng quyền 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 thông báo có giới hạn về thời gian và người dùng có thể nhìn thấy, hãy cân nhắc sử dụng thông báo có mức độ ưu tiên cao để cho phép phân phối ở chế độ Ngủ. Tin nhắn 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ề thông báo có mức độ ưu tiên cao để biết thêm thông tin.

Đối với những thông báo không dẫn đến thông báo, chẳng hạn như 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 thông báo FCM có mức độ ưu tiên bình thường. Thông báo có mức độ ưu tiên bình thường sẽ được phân phối ngay lập tức nếu thiết bị không ở chế độ Ngủ. Nếu thiết bị ở chế độ Nghỉ, thì các thông báo này sẽ được phân phối trong các khoảng thời gian bảo trì Nghỉ định kỳ hoặc ngay khi người dùng đánh thức thiết bị.

Theo phương pháp chung hay nhất, nếu ứng dụng của bạn yêu cầu thông báo 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 thông báo có mức độ ưu tiên cao cho các thông báo dẫn đến thông báo dành cho người dùng.

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ý khả năng kết nối mạng, chuông báo, công việc và đồng bộ hoá, cũng như bằng cách sử dụng thông báo FCM. Đối với một số ít trường hợp sử dụng, điều này có thể là chưa đủ. Đối với những trường hợp như vậy, hệ thống sẽ cung cấp một danh sách có thể định cấu hình các ứng dụng được miễn trừ một phần khỏi các 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à duy trì 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 này, giống như các hạn chế áp dụng cho các ứng dụng khác. Ví dụ: các công việc và hoạt động đồng bộ hoá của ứng dụng bị trì hoãn ở API cấp 23 trở xuống và các chuông báo AlarmManager thông thường của ứng dụng đó sẽ không kích hoạt. Một ứng dụng có thể kiểm tra xem ứng dụng đó có đang 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 còn cung cấp các cách để ứng dụng yêu cầu người dùng miễn trừ:

Ứng dụng có thể kiểm tra xem ứng dụng đó hiện có 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

Để đảm bảo người dùng có trải nghiệm tuyệt vời, hãy kiểm thử toàn bộ ứng dụng của bạn ở 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 bằng hình ả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 của bạn.
  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ế độ rảnh 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ị. Đảm bảo ứng dụng khôi phục nhẹ nhàng 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 bằng ứng dụng của bạn, 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 bằng hình ả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 của bạn.
  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ờ ứ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 hoạt động đá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. Đả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 sử dụng được chấp nhận để đượ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 chấp nhận sử dụng hành động theo ý định ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS trong những trường hợp này hay không. Nhìn chung, ứng dụng của bạn không đáp ứng các trường hợp ngoại lệ này, trừ phi chế độ Ngủ hoặc Chế độ chờ ứng dụng làm gián đoạn 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 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? Được miễn trừ? Ghi chú
Ứng dụng nhắn tin nhanh, 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ị ở chế độ Nghỉ hoặc ứng dụng ở Chế độ chờ ứng dụng. Có, sử dụng FCM Không được chấp nhận Sử dụng thông báo 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 thư có mức độ ưu tiên cao FCM.
Ứng dụng nhắn tin nhanh, trò chuyện hoặc gọi điện; ứng dụng VOIP dành cho doanh nghiệp. Không, không thể sử dụng FCM do phần phụ thuộc kỹ thuật trên một dịch vụ nhắn tin khác hoặc tính năng Tiết kiệm pin và Chế độ chờ ứng dụng làm gián đoạn chức năng cốt lõi của ứng dụng. Chấp nhận được
Ứng dụng An toàn. Là những ứng dụng giữ an toàn cho người dùng và gia đình. (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 để 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 một 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