Đánh thức quá nhiều lần

Đá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 đã được giới thiệu trong các phiên bản đầu tiên của nền tảng Android, nhưng theo thời gian, nhiều trường hợp sử dụng trước đây yêu cầu AlarmManager nay đã hoàn thiện hơn nhờ các tính năng mới hơn, chẳng 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 trong AlarmManager, bao gồm cờ RTC_WAKEUPhoặc ELAPSED_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.

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.