Tối ưu hoá mức sử dụng pin cho API lên lịch tác vụ

Trang này đề xuất một số phương pháp hay nhất để thiết lập các tác vụ hoạt động tốt ở chế độ nền. Các phương pháp hay nhất này đặc biệt nhắm đến việc giảm mức tiêu thụ pin, nhưng cũng có thể cải thiện hiệu suất của thiết bị theo những cách khác, chẳng hạn như giảm mức sử dụng mạng.

Chọn các điều kiện ràng buộc tối ưu và kết hợp các nhiệm vụ

Để giảm thiểu tải cho các tác vụ của bạn đặt trên thiết bị, bạn cần chỉ định các quy tắc ràng buộc tối ưu. (Đối với các công việc JobScheduler, hãy xem JobInfo.Builder để biết danh sách các quy tắc ràng buộc.) Lấy một ví dụ, nếu muốn đảm bảo ứng dụng không hết pin, bạn nên chỉ định quy tắc ràng buộc RequiresCharging. Quy tắc ràng buộc này yêu cầu hệ thống không chạy công việc trừ phi mức pin thực sự tăng lên. Tương tự, việc sử dụng Wi-Fi thường yêu cầu ít điện năng hơn dữ liệu di động. Vì vậy, nếu tác vụ của bạn cần kết nối mạng nhưng có thể đợi cho đến khi có mạng không đo lượng dữ liệu, thì bạn nên thiết lập quy tắc ràng buộc NetworkType.UNMETERED.

Ngoài ra, nếu có nhiều tác vụ tương tự có cùng một điều kiện ràng buộc, bạn nên kết hợp các tác vụ đó thành một tác vụ duy nhất để thiết bị chỉ bị đánh thức một lần. Ví dụ: giả sử ứng dụng của bạn có 3 tập dữ liệu khác nhau để đồng bộ hoá với bộ nhớ trên đám mây. Thay vì lên lịch cho 3 tác vụ riêng biệt (một tác vụ cho mỗi tập dữ liệu), bạn thường chỉ cần lên lịch cho một tác vụ "đồng bộ hoá dữ liệu", xác định các quy tắc ràng buộc phù hợp và để tác vụ đó thực hiện mọi hoạt động đồng bộ hoá dữ liệu đang chờ xử lý khi nó chạy.

Tuy nhiên, bạn không nên cố gắng kết hợp các tác vụ không liên quan vào một tác vụ duy nhất. Thay vào đó, bạn chỉ cần đặt các quy tắc ràng buộc thích hợp cho từng tác vụ. Ví dụ: nếu các tác vụ có mức độ ưu tiên thấp, hãy nhớ chỉ định rằng các tác vụ đó sẽ chạy khi thiết bị ở trạng thái rảnh và đang sạc. Bằng cách đó, ngay cả khi thiết bị bị đánh thức nhiều lần, thiết bị sẽ không ảnh hưởng đến trải nghiệm người dùng hoặc ảnh hưởng đến thời lượng pin.

Chỉ đánh dấu việc cần làm là được ưu tiên khi cần có thời gian

Nếu một việc cần làm đặc biệt khẩn cấp, bạn có thể đánh dấu việc cần làm đó là ưu tiên. (Đối với các công việc trong JobScheduler, hãy gọi JobInfo.Builder.setExpedited(true).) Việc này sẽ ưu tiên nhiệm vụ theo một số cách. Ví dụ: hệ thống chạy các tác vụ đó ngay khi có thể và các hạn chế quản lý nguồn pin có ít khả năng ảnh hưởng đến các tác vụ ưu tiên.

Vì những lý do này, bạn nên cẩn thận chỉ đánh dấu một việc cần làm là ưu tiên khi cần. Vì các nhiệm vụ ưu tiên có thể ghi đè một số mức độ hiệu quả của hệ thống, nên các nhiệm vụ ưu tiên có thể tiêu hao nhiều năng lượng hơn nếu chúng không được đánh dấu theo cách đó.

Bạn chỉ nên đánh dấu một tác vụ là ưu tiên nếu tác vụ đó cần nhiều thời gian và trải nghiệm người dùng sẽ bị suy giảm nếu tác vụ đó mất nhiều thời gian thực thi hơn. Ví dụ: nếu ứng dụng của bạn chạy một tác vụ để xử lý thông báo FCM có mức độ ưu tiên cao, thì đó là lý do thích hợp để đánh dấu tác vụ đó là ưu tiên. Tuy nhiên, bạn không nên đánh dấu một nhiệm vụ là được ưu tiên chỉ để ghi đè các hoạt động tối ưu hoá hệ thống.

Kiểm tra lý do các việc cần làm bị dừng

Nếu các tác vụ của bạn dừng trước khi hoàn thành, bạn có thể kiểm tra lý do chúng bị dừng bằng cách gọi WorkInfo.getStopReason(). (Đối với các công việc JobScheduler, hãy gọi JobParameters.getStopReason(). Bạn cần thực hiện việc này vì một số lý do. Trước hết, tất nhiên, bạn muốn nhiệm vụ của mình hoàn thành. Khi biết lý do khiến các nhiệm vụ của bạn bị dừng, bạn sẽ tránh được các tình huống tương tự. Tuy nhiên, hệ thống có thể sẽ dừng các tác vụ do hành vi sử dụng quá mức tài nguyên hệ thống. Bạn không muốn ứng dụng của mình trở thành một công dân xấu, sử dụng pin hoặc mạng một cách không cần thiết.

Ví dụ: nếu các tác vụ của bạn thường xuyên bị dừng vì lý do STOP_REASON_TIMEOUT, thì có thể có một trường hợp ngoại lệ đôi khi khiến các tác vụ của bạn mất nhiều thời gian hơn dự kiến.

Bạn nên sử dụng công cụ phân tích để theo dõi xem các nhiệm vụ của ứng dụng có bị dừng không và vì lý do gì.