6

我試圖使用鬧鐘管理器的setExactAndAllowWhileIdle每30分鐘在我的應用程序中發出警報,但它不工作!Android鬧鐘管理器setExactAndAllowWhileIdle()在Android 7.0中不起作用在打盹模式下的牛軋糖

我通過發送推送通知來測試功能,只要我收到報警信號。

問題是:當設備閒置一段時間後進入打盹模式時,我不再收到警報。但是,只要我打開屏幕,我會收到通知。我的應用需要準確的報警,需要每隔30分鐘準時發送一次!由於設備處於打盹模式,因此不能接收延遲報警或丟失報警!

我曾經在我的代碼如下:

  1. 我設置鬧鈴時,我打開我的應用程序。
  2. 我使用WakefulBroadcastReceiver接收警報信號。在我的 onReceive()方法中,我設置了下一個警報。我也是,啓動一個 startWakefulService,它只發布推送通知,然後停止 本身。
  3. 我在onReceive()的結尾調用了completeWakefulIntent。
  4. 我試圖同時測試:RTC_WAKEUP & ELAPSED_REALTIME_WAKEUP

注:

  • 的wakefulbroadcastReceiver類是在清單註冊。
  • 我添加權限:android.permission.WAKE_LOCK
  • 我試着白名單我的應用程序,但結果都是一樣的
  • 我嘗試使用setAlarmClock()甚至在打盹 模式工作的時候,有一個人掉隊/延遲報警每50個警報。所以,這也不是 完美。我不希望用戶在那裏看到一個報警圖標 。
  • 不僅在打盹時setExactAndAllowWhileIdle()不起作用,而且它在工作時的準確度也很差。我通常會在1-3分鐘後或1-3分鐘內收到大量的報警信號
  • 我使用華爲Mate 8和Android 7.0牛軋糖進行測試。

P.S: 回答之前請確保您瞭解的施加的限制開始的Android 6.0 M和打盹模式。

鏈接1:https://developer.android.com/training/monitoring-device-state/doze-standby.html

總之它這樣說:

  • 如果您需要設置的報警,雖然在打盹火災,使用 setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
  • 使用setAlarmClock()設置的警報繼續正常啓動 - 系統在這些警報觸發前即刻退出。

現在,爲什麼我不能每隔30分鐘使用setExactAndAllowWhileIdle()獲得準確的報警信號? 而且,爲什麼不是setAlarmClock() 100%可靠?!

+0

它可能[幫助](https://stackoverflow.com/a/39739886/3117966) – Nisarg

+1

我有同樣的問題,並看到類似的意見。我希望Google的某個人能夠加強並解決此問題。 – d777

+0

@Mena 您是否找到解決方案,我有同樣的問題。 – CauCuKien

回答

0

你可能會得到準確的報警,但in Doze mode

系統忽略喚醒鎖。

所以好像AlarmManager.setAlarmClock是,如果你真的需要每隔30分鐘觸發的唯一可接受的解決方案。這可能會否定所有打盹模式的節能...

順便說一句:看起來你可以用adb shell dumpsys alarm看到報警。