Đánh thức là một cơ chế trong API AlarmManager
cho phép các nhà phát triển đặt chuông báo để đánh thức thiết bị vào một thời điểm cụ thể. Ứng dụng của bạn đặt chuông báo đánh thức bằng cách gọi một trong các phương thức set()
trong
AlarmManager
với cờ RTC_WAKEUP
hoặc
ELAPSED_REALTIME_WAKEUP
. Khi chuông báo đánh thức được kích hoạt, thiết bị sẽ thoát khỏi chế độ tiết kiệm pin và giữ khoá chế độ thức một phần trong khi thực hiện phương thức chuông báo
onReceive()
hoặc onAlarm()
. Nếu bạn kích hoạt chuông báo thức quá nhiều lần, nó có thể làm tiêu hao pin của thiết bị.
Để giúp bạn cải thiện chất lượng ứng dụng, Android sẽ tự động giám sát các ứng dụng để phát hiện các chuông báo bị đánh thức quá nhiều lần và hiển thị thông tin này trong Android vitals. Để biết thông tin về cách thu thập dữ liệu, vui lòng xem Tài liệu trên Play Console.
Nếu ứng dụng của bạn đánh thức thiết bị quá nhiều lần, bạn có thể tham khảo hướng dẫn trên trang này để chẩn đoán và khắc phục sự cố.
Khắc phục sự cố
AlarmManager
là
được giới thiệu trong các phiên bản ban đầu của nền tảng Android, nhưng theo thời gian, nhiều người sử dụng
các trường hợp trước đây yêu cầu
AlarmManager
hiện tại
được phân phát tốt hơn bởi các tính năng mới hơn như
WorkManager.
Phần này sẽ nói về các mẹo để giảm số lần đánh thức chuông báo, nhưng về lâu dài, hãy cân nhắc di chuyển ứng dụng của bạn theo các đề xuất ở phần các phương pháp tốt nhất.
Xác định các vị trí trong ứng dụng nơi bạn dùng để lên lịch báo thức và giảm tần suất kích hoạt các chuông báo đó. Dưới đây là một số mẹo:
Tìm lệnh gọi đến các phương thức
set()
khác nhau trongAlarmManager
, bao gồm cờRTC_WAKEUP
hoặcELAPSED_REALTIME_WAKEUP
.Bạn nên đưa tên gói, lớp hoặc phương thức vào tên thẻ của chuông báo để có thể dễ dàng xác định vị trí trong nguồn nơi đã đặt chuông báo. Dưới đây là một số mẹo bổ sung:
- Bỏ mọi thông tin nhận dạng cá nhân (PII) trong tên, chẳng hạn như địa chỉ email. Nếu không, thiết bị sẽ ghi lại là
_UNKNOWN
thay vì tên chuông báo. - Đừng dùng tên lớp hoặc phương thức theo phương thức lập trình, chẳng hạn như gọi
getName()
, vì phương thức này có thể bị Proguard làm rối mã nguồn. Thay vào đó, hãy dùng một chuỗi được cố định trong giá trị mã. - Đừng thêm bộ đếm hoặc giá trị nhận dạng duy nhất vào thẻ của chuông báo. Hệ thống sẽ không thể tổng hợp các chuông báo được đặt theo cách đó, vì tất cả chúng đều có giá trị nhận dạng duy nhất.
- Bỏ mọi thông tin nhận dạng cá nhân (PII) trong tên, chẳng hạn như địa chỉ email. Nếu không, thiết bị sẽ ghi lại là
Sau khi khắc phục sự cố, hãy xác minh chuông báo thức của bạn đang hoạt động như mong đợi bằng cách chạy lệnh ADB sau:
adb shell dumpsys alarm
Lệnh này cung cấp thông tin về trạng thái của dịch vụ hệ thống báo động trên thiết bị. Để biết thêm thông tin, vui lòng xem dumpsys.
Các phương pháp hay nhất
Chỉ sử dụng chuông báo đánh thức khi ứng dụng của bạn cần thực hiện thao tác dành cho người dùng (chẳng hạn như đăng thông báo hoặc cảnh báo người dùng). Để biết danh sách các phương pháp hay nhất dành cho AlarmManager, vui lòng xem bài viết Lên lịch chuông báo.
Đừng sử dụng AlarmManager
để lên lịch các tác vụ trong nền, đặc biệt là các tác vụ định kỳ hoặc tác vụ về mạng. Sử dụng
WorkManager
để lên lịch các tác vụ ở chế độ nền, vì lệnh này mang lại các lợi ích sau:
- tạo lô – các nhiệm vụ được kết hợp để giảm mức tiêu thụ pin
- liên tục – nếu thiết bị được khởi động lại, các nhiệm vụ WorkManager đã lên lịch sẽ chạy sau khi quá trình khởi động lại kết thúc
- tiêu chí – nhiệm vụ có thể chạy dựa trên các điều kiện, chẳng hạn như thiết bị có đang sạc hay Wi-Fi có đang hoạt động hay không
Để biết thêm thông tin chi tiết, vui lòng xem phần Hướng dẫn xử lý nền.
Đừng sử dụng AlarmManager
để lên lịch các hoạt động định giờ, nó chỉ hợp lệ khi ứng dụng đang chạy (nói cách khác là hoạt động định giờ sẽ bị hủy khi người dùng thoát khỏi ứng dụng). Trong những trường hợp đó, hãy dùng lớp Handler
, vì lớp này dễ sử dụng hơn và hiệu quả hơn nhiều.
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Lỗi xảy ra với tính năng khoá chế độ thức một phần
- ANR