Android có hai 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ý hành vi của ứng dụng khi thiết bị không kết nối với nguồn điện: Chế độ ngủ và Chế độ chờ ứng dụng. Chế độ ngủ giảm mức tiêu thụ pin bằng cách trì hoãn hoạt động mạng và CPU ở chế độ 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 ứng dụng vào một số tài nguyên tiêu tốn pin sẽ bị trì hoãn cho đến khi có thời gian bảo trì. Các hạn chế cụ thể được liệt kê trong phần Các hạn chế khi quản lý nguồn pin.
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 cấp độ API mục tiêu 23 hay không. Để đảm bảo mang lại 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, đồng thời điều chỉnh mã nếu cầ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 không cắm sạc và không dùng thiết bị trong một khoảng thời gian, đồng thờ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ụ sử 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 của ứng dụng.
Định kỳ, hệ thống sẽ thoát khỏi chế độ Nghỉ giải lao trong một thời gian ngắn để cho phép các ứng dụng hoàn tất 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 hoạt động đồ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.
Khi thời gian bảo trì kết thúc, hệ thống sẽ lại chuyển sang chế độ Nghỉ, tạm ngưng quyền truy cập mạng và trì hoãn các công việc, hoạt động đồng bộ hoá và chuông báo. Theo thời gian, hệ thống sẽ lên lịch cho các khoảng thời gian 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 lâu hơn khi thiết bị 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ả ứng dụng sẽ tiếp tục hoạt động bình thường.
Các quy định hạn chế của chế độ Nghỉ
Hệ thống áp dụng các quy định hạn chế sau đây cho ứng dụng của bạn khi ở chế độ Nghỉ:
- Tạm ngưng quyền truy cập mạng.
- Bỏ qua khoá chế độ thức.
- Trì hoãn chuông báo
AlarmManagerthông thường, bao gồm cảsetExact()vàsetWindow(), cho đến khoảng thời gian bảo trì tiếp theo.- Nếu bạn cần đặt chuông báo kích hoạt khi ở chế độ Nghỉ, hãy sử dụng
setAndAllowWhileIdle()hoặcsetExactAndAllowWhileIdle(). - Chuông báo được đặt bằng
setAlarmClock()vẫn tiếp tục đổ chuông như bình thường. Hệ thống sẽ thoát khỏi chế độ Nghỉ ngay trước khi các chuông báo đó kích hoạt.
- Nếu bạn cần đặt chuông báo kích hoạt khi ở chế độ Nghỉ, hãy sử dụng
- Không thực hiện quét tìm Wi-Fi.
- Không cho phép bộ điều hợp đồng bộ hoá chạy.
- Không cho phép
JobSchedulerchạy.
Danh sách kiểm tra cho chế độ Nghỉ
- Nếu có thể, hãy sử dụng Giải pháp gửi thông báo qua đám mây của Firebase (FCM) để gửi thông báo đến thiết bị.
- Nếu người dùng phải thấy thông báo ngay lập tức, hãy sử dụng loại thông báo
RemoteNotification. Để được hướng dẫn thêm, hãy tham khảo tài liệu của FCM về loại thông báoRemoteNotification. - Cung cấp đủ thông tin trong tải trọng thông báo ban đầu để không cần truy cập mạng sau đó.
- Đặt chuông báo quan trọng bằng
setAndAllowWhileIdle()vàsetExactAndAllowWhileIdle(). - Kiểm thử ứng dụng ở chế độ Nghỉ.
Điều chỉnh ứng dụng cho phù hợp với chế độ Nghỉ
Chế độ ngủ li bì 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 mà ứng dụng cung cấp và 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ỳ Chế độ ngủ li bì 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à hoạt động đồng bộ hoá. Ứng dụng phải có khả năng quản lý hiệu quả các hoạt động trong mỗi khoảng thời gian bảo trì.
Để hỗ trợ việc lên lịch báo thức, bạn có thể sử dụng hai phương thức AlarmManager: setAndAllowWhileIdle() và setExactAndAllowWhileIdle(). Với các phương thức này, bạn có thể đặt chuông báo kích hoạt ngay cả khi thiết bị đang ở chế độ Nghỉ.
Hạn chế của chế độ Nghỉ giải lao đố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à 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ư thông báo nhắc nhở hoặc thông báo. Nếu ứng dụng của bạn cần có kết nối liên tục với mạng để nhận thông báo, 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 ở 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ỉ, đồng thời 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ử 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 đ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 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 và không có điều kiện nào sau đây được á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 chạy trên nền trước, dưới dạng một hoạt động hoặc dịch vụ nền trước, hoặc đang được một hoạt động hoặc dịch vụ nền trước khá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 ứng dụng khỏi trạng thái chờ, cho phép ứng dụng truy cập mạng và thực thi mọi công việc cũng như quá trình đồng bộ hoá đang chờ xử lý. Nếu thiết bị ở trạng thái rảnh trong thời gian dài, thì hệ thống sẽ cho phép các ứng dụng 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 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ị, hỗ trợ bạn gửi thông báo theo thời gian thực từ dịch vụ phụ trợ đến ứ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 với đám mây. Tất cả ứng dụng cần nhắn tin theo thời gian thực đều có thể dùng chung kết nối này. Kết nối dùng chung này giúp tối ưu hoá đáng kể mức tiêu thụ pin bằng cách loại bỏ nhu cầu duy trì các kết nối ổn định riêng biệt của nhiều ứng dụng, điều này có thể làm hao 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 ổn định của riêng bạn.
FCM được tối ưu hoá để hoạt động với chế độ Nghỉ và Chế độ chờ ứng dụng. Loại thông báo RemoteNotification của FCM cho phép bạn đánh thức ứng dụng để 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 các thông báo có giới hạn thời gian và người dùng có thể nhìn thấy, hãy cân nhắc sử dụng các loại thông báo RemoteNotification để cho phép gửi thông báo ở chế độ Nghỉ. Những thông báo này có thể dẫn đến thông báo. Hãy xem
hướng dẫn của FCM về RemoteNotification để 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ư giữ cho nội dung ứng dụng đã cập nhật ở chế độ nền hoặc bắt đầu đồng bộ hoá dữ liệu, hãy sử dụng thông báo FCM BackgroundSync. Những thông báo này có mức độ ưu tiên thấp và có thể bị trì hoãn hoặc điều tiết để tối ưu hoá pin của thiết bị.
Theo phương pháp hay nhất, nếu ứng dụng của bạn yêu cầu nhắn tin xuôi dò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 đó sử dụng RemoteNotification cho những thông báo dẫn đến thông báo dành cho người dùng.
Đừng sử dụng RemoteNotification trong các trường hợp sau:
- Khi thông báo chắc chắn sẽ không xuất hiện.
- Để gửi ngay các thông báo chỉ cập nhật trạng thái ứng dụng, chẳng hạn như giữ nội dung ứng dụng đã cập nhật ở chế độ nền hoặc bắt đầu đồng bộ hoá dữ liệu.
- Là một phương tiện để nhắc người dùng cuối cấp quyền.
Hỗ trợ cho các trường hợp sử dụng khác
Hầu hết mọi ứ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 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 gồm 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á của 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 quy định hạn chế khác vẫn áp dụng cho ứng dụng này, giống như đối với 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 sẽ bị trì hoãn trên cấp độ API 23 trở xuống và 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 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 ứ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ừ cho ứng dụng:
- Hầu hết các ứng dụng đều có thể gọi một ý định chứa
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Thay vào đó, các ứng dụng đáp ứng trường hợp sử dụng được chấp nhận có thể gọi một ý định chứa hành động theo ý định
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSđể cho phép người dùng thêm trực tiếp ứng dụng vào danh sách miễn trừ mà không cần chuyển đến phần cài đặt hệ thống.
Ứng dụng có thể kiểm tra xem 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 tuyệt vời, hãy kiểm thử đầy đủ ứng dụng của bạn ở chế độ Nghỉ và Chế độ chờ ứng dụng.
Kiểm thử ứng dụng ở chế độ Nghỉ
Bạn có thể kiểm thử Chế độ ngủ bằng cách làm như sau:
- Đị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.
- Kết nối thiết bị với máy phát triển và cài đặt ứng dụng.
- Chạy ứng dụng và để ứng dụng hoạt động.
- 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 - 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 - 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 - 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 một cách 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 của bạn, hãy làm như sau:
- Đị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.
- Kết nối thiết bị với máy phát triển và cài đặt ứng dụng.
- Chạy ứng dụng và để ứng dụng hoạt động.
- 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 - Mô phỏng việ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> - 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 một cách mượt mà từ chế độ chờ. Cụ thể, hãy kiểm tra xem thông báo và các công việc trong nền của ứng dụng có hoạt động như mong đợi hay không.
Các trường hợp sử dụng đượ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 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ủ li bì 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 thông báo RemoteNotification FCM.
Để 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ể sử dụng FCM không? | Có thể miễn trừ không? | 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 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 FCM RemoteNotification để đánh thức ứng dụng và truy cập vào mạng. |
Có, nhưng không sử dụng thông báo FCM RemoteNotification. |
||||
| Ứ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 về mặt kỹ thuật vào một dịch vụ nhắn tin khác hoặc do 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 đảm bảo an toàn cho người dùng và gia đình của họ. | (nếu có). | Chấp nhận được | |
| Ứng dụng tự động hoá tác vụ. | Chức năng cốt lõi của ứng dụng là lên lịch cho các hành động tự động, chẳng hạn như nhắn tin nhanh, cuộc 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 của 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 cung 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 kết nối với thiết bị ngoại vi theo định kỳ để đồ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 hồ sơ Bluetooth tiêu chuẩn. | (nếu có). | Không được chấp nhận |