6

Tôi đang cố gắng tạo báo thức trong ứng dụng mỗi 30 phút bằng cách sử dụng Trình quản lý báo động setExactAndAllowWhileIdle nhưng không hoạt động!Trình quản lý báo thức Android được thiết lậpExactAndAllowWhileIdle() không hoạt động trong Android 7.0 Nougat ở chế độ Doze

Tôi kiểm tra chức năng bằng cách gửi thông báo đẩy bất cứ khi nào tôi nhận được tín hiệu cảnh báo.

Vấn đề là: khi thiết bị chuyển sang chế độ ngủ gật sau một thời gian rảnh, tôi không còn nhận được báo thức nữa. Tuy nhiên, ngay khi tôi bật Trên màn hình, tôi nhận được một thông báo. Ứng dụng của tôi cần báo thức chính xác cần được phân phối chính xác đúng giờ mỗi 30 phút! Nó không thể đủ khả năng để nhận được báo động chậm trễ hoặc bị rơi vì thiết bị đang ở chế độ Doze!

tôi đã sử dụng sau trong mã của tôi:

  1. tôi đặt báo thức khi tôi mở ứng dụng của tôi.
  2. Tôi nhận tín hiệu cảnh báo bằng cách sử dụng WakefulBroadcastReceiver. Trong phương thức onReceive() Tôi đặt báo thức tiếp theo. Ngoài ra, tôi cũng bắt đầu một dịch vụ bắt đầu startWakefulService chỉ phát hành thông báo đẩy, sau đó dừng tự động .
  3. Tôi gọi completeWakefulIntent ở cuối onReceive().
  4. tôi đã cố gắng thử nghiệm cả hai: RTC_WAKEUP & ELAPSED_REALTIME_WAKEUP

Ghi chú:

  • Lớp wakefulbroadcastReceiver được đăng ký trong Manifest.
  • tôi thêm quyền cho: android.permission.WAKE_LOCK
  • tôi đã cố gắng trắng-Bảng liệt kê ứng dụng của tôi, nhưng kết quả đều giống nhau
  • tôi đã cố gắng sử dụng setAlarmClock() mà làm việc tất cả thời gian ngay cả trong chế độ doze , với một giảm/trì hoãn báo động cứ 50 báo động. Vì vậy, nó cũng không phải là hoàn hảo. Và tôi không muốn người dùng thấy biểu tượng báo thức mọi lúc lên ở đó.
  • Không chỉ setExactAndAllowWhileIdle() không hoạt động trong quá trình ngủ gật, nhưng cũng có thể có độ chính xác khủng khiếp khi hoạt động. Tôi thường nhận được rất nhiều tín hiệu báo động
    hoặc sau 1-3 phút hoặc 1-3 phút trước đó.
  • Tôi đang thử nghiệm sử dụng Huawei Mate 8 và android 7.0 Nougat.

Tái bút: Trước khi trả lời hãy chắc chắn rằng bạn nhận thức được những hạn chế áp đặt bắt đầu Android 6.0 M và chế độ Nữu Thừa.

link1: https://developer.android.com/training/monitoring-device-state/doze-standby.html

Nói tóm lại nó nói này:

  • Nếu bạn cần phải cài đặt cảnh báo rằng lửa trong khi ở Nữu Thừa, sử dụng setAndAllowWhileIdle() hoặc setExactAndAllowWhileIdle().
  • Báo thức được đặt bằng setAlarmClock() tiếp tục kích hoạt bình thường - hệ thống thoát Doze ngay trước khi báo thức đó kích hoạt.

Bây giờ, tại sao tôi không nhận được tín hiệu cảnh báo chính xác sau mỗi 30 phút sử dụng setExactAndAllowWhileIdle()?! Và tại sao không phải là setAlarmClock() đáng tin cậy 100% ?!

+0

Có thể [help] (https://stackoverflow.com/a/39739886/3117966) – Nisarg

+1

Tôi gặp vấn đề tương tự và thấy các quan sát tương tự. Tôi muốn một người nào đó từ Google có thể bước lên đĩa và khắc phục sự cố này. – d777

+0

@Mena Bạn đã tìm thấy giải pháp cho điều này, tôi có cùng một vấn đề. – CauCuKien

Trả lời

0

Bạn có thể nhận được báo động chính xác, nhưng in Doze mode

Hệ thống bỏ qua ổ khóa thức.

Vì vậy, nó có vẻ như mặc dù AlarmManager.setAlarmClock là giải pháp duy nhất có thể chấp nhận nếu bạn thực sự cần phải kích hoạt mỗi 30 phút. Điều này có thể sẽ phủ nhận tất cả tiết kiệm năng lượng chế độ doze ...

BTW: có vẻ như bạn có thể thấy báo thức với adb shell dumpsys alarm.

Các vấn đề liên quan