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

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

Chế độ Nghỉ và Chế độ chờ ứng dụng quản lý hành vi của tất cả các ứng dụng chạy trên Android 6.0 trở lên, bất kể chúng có đang nhắm mục tiêu cụ thể đế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 thử nghiệm ứng dụng của bạn trong chế độ Nghỉ và Ứng dụng Chế độ chờ và thực hiện mọi điều chỉnh cần thiết đối với mã của bạn. Nội dung sau đây sẽ cung cấp chi tiết.

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

Nếu người dùng để thiết bị ở trạng thái không cắm sạc và không đứng yên trong một khoảng thời gian, với màn hình tắt, thiết bị 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ế ứng dụng quyền truy cập vào mạng và dùng nhiều CPU luôn miễn phí. Việc này cũng ngăn các ứng dụng truy cập mạng và trì hoãn thời gian chờ công việc, đồng bộ hoá và báo thức chuẩn.

Theo định kỳ, hệ thống 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 của họ. Trong thời gian bảo trì này, hệ thống 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ế độ Nghỉ cung cấp thời gian bảo trì định kỳ cho để 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 lại chuyển sang chế độ Nghỉ, tạm ngưng 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, việc hệ thống lên lịch bảo trì ít thường xuyên hơn, giúp giảm pin mức tiêu thụ năng lượng 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 đang 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 bình thường của bạn.

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

Điều chỉnh ứng dụng của bạn cho phù hợp với chế độ Nghỉ

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

Để lên lịch chuông báo, bạn có thể dùng 2 AlarmManager phương thức: setAndAllowWhileIdle()setExactAndAllowWhileIdle(). Bạn có thể đặt chuông báo bằng các phương pháp này kích hoạt ngay cả khi thiết bị ở chế độ Nghỉ.

Quy định hạn chế về 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 thông báo theo thời gian thực, chẳng hạn như kim kiểm 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 nhất 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 chuyển sang và thoát khỏi chế độ Nghỉ và quan sát hành vi của ứng dụng. Để biết thông tin chi tiết, hãy xem 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 không hoạt động tích cực sử dụng ứng dụng. Hệ thống sẽ đưa ra quyết đị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 mà không gặp phải tình trạng 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 đang chạy ở nền trước, có thể là 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 khác hay dịch vụ trên nền trước khác sử dụng.
  • Ứng dụng tạo 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 từ trạng thái chờ, cho phép chúng thoải mái truy cập mạng và thực thi các 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 cho phép các ứng dụng không hoạt động 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

Firebase Cloud Nhắn tin (FCM) là dịch vụ từ đám mây đến thiết bị, cho phép bạn hỗ trợ giải pháp theo thời gian thực thông báo hạ nguồn 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 liên tục, duy nhất với đám mây. Tất cả các ứng dụng cần tính năng nhắn tin theo thời gian thực 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 không cần thiết cho nhiều ứng dụng để duy trì các kết nối liên tục riêng biệt riêng biệt. Điều này có thể làm tiêu hao pin nhanh chóng. Vì lý do này, nếu ứng dụng của bạn yêu cầu tính năng nhắn tin tích hợp với dịch vụ phụ trợ, bạn nên sử dụng FCM nếu thay vì duy trì kết nối mạng ổn định của riêng bạn.

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. FCM thông báo có mức độ ưu tiên cao cho phép bạn đánh thức ứng dụng của mình để thu hút người dùng. Trong chế độ Nghỉ hoặc trong ứng dụng Ở chế độ chờ, hệ thống 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ề lại 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 thông báo ưu tiên để phân phối ở chế độ Nghỉ. Thư có mức độ ưu tiên cao có thể sẽ dẫn đến thông báo. Xem FCM hướng dẫn 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 tin nhắn không dẫn đến thông báo, chẳng hạn như giữ lại nội dung ứng dụng cập nhật trong nền hoặc bắt đầu đồng bộ hoá dữ liệu, hãy dùng FCM có mức độ ưu tiên bình thường tin nhắn. Các tin nhắn có mức độ ưu tiên thông thường sẽ được gửi ngay lập tức nếu thiết bị không hoạt động trong chế độ Nghỉ. Nếu thiết bị ở chế độ Nghỉ, thì thiết bị sẽ được phân phối trong định kỳ Nghỉ bảo trì hoặc nghỉ 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 cần có thông điệp truyền phát, 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 đó dùng các thông báo có mức độ ưu tiên cao chỉ đối với các thông báo dẫn đến thông báo dành cho người dùng.

Hỗ trợ cho 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à đồng bộ hoá cũng như bằng cách sử dụng tin nhắn FCM. Dành cho một nhóm nhỏ sử dụng trườ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 sẽ cung cấp 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 chế độ Nghỉ và Chế độ chờ ứng dụng tối ưu hoá.

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

Người dùng có thể thiết lập 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 để ứ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ó 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

Để đảm bảo người dùng có trải nghiệm chất lượng cao, hãy kiểm thử toàn bộ ứng dụng trong 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ó Android 6.0 (API) hình ảnh hệ thống 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ị. Nhãn hiệu đả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 với ứ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 có Android 6.0 (API) hình ảnh hệ thống 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 ứng dụng đó. Đảm bảo ứng dụng khôi phục nhẹ nhàng từ chế độ chờ. Cụ thể, hãy kiểm tra xem ứng dụng của bạn các thông báo và công việc trong nền hoạt động như dự kiến.

Các trường hợp miễn trừ được chấp nhận

Bảng sau đây nêu bật một số trường hợp sử dụng và liệu trường hợp này có được chấp nhận hay không để ứng dụng sử dụng ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS hành động theo ý định trong các trường hợp này. Nhìn chung, ứng dụng của bạn không đáp ứng những yêu cầu này ngoại lệ trừ khi chế độ Nghỉ hoặc Chế độ chờ ứng dụng phá vỡ 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 FCM có mức độ ưu tiên cao tin nhắn.

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

Loại Trường hợp sử dụng Có thể 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 tin nhắn theo thời gian thực cho người dùng trong 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 FCM để đánh thức ứng dụng và truy cập 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ụ thuộc kỹ thuật vào thông báo khác hoặc 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. 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ư thao tác tức thì tính năng nhắn tin, 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 để cung cấp thiết bị ngoại vi Internet. (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ị như tai nghe không dây, qua cấu hình Bluetooth tiêu chuẩn. (nếu có). Không được chấp nhận