[英]Android Alarm Manager setExactAndAllowWhileIdle() not working in Android 7.0 Nougat in Doze mode
我正在嘗試使用警報管理器的setExactAndAllowWhileIdle
每 30 分鍾在我的應用程序中觸發一次警報,但它不起作用!
每當我收到警報信號時,我都會通過發出推送通知來測試該功能。
問題是:當設備閑置一段時間后進入打盹模式時,我不再收到警報。 但是,一旦我打開屏幕,我就會收到一條通知。 我的應用程序需要准確的警報,需要每 30 分鍾准時發送一次! 由於設備處於打盹模式,因此無法接收延遲警報或掉線警報!
我在我的代碼中使用了以下內容:
onReceive()
方法中,我設置了下一個鬧鍾。 我還啟動了一個僅發出推送通知的 startWakefulService,然后自行停止。注意事項:
android.permission.WAKE_LOCK
setAlarmClock()
即使在打瞌睡模式下也能一直工作,每 50 個警報就有一個下降/延遲警報。 所以,它也不完美。 而且我不希望用戶一直在那里看到警報圖標。PS:在回答之前,請確保您了解啟動 Android 6.0 M 和 Doze 模式的限制。
鏈接 1: https : //developer.android.com/training/monitoring-device-state/doze-standby.html
總之它是這樣說的:
現在,為什么我不能使用setExactAndAllowWhileIdle()
每 30 分鍾獲得一次准確的警報信號?! 而且,為什么setAlarmClock()
不是 100% 可靠的?!
您可能會收到准確的警報,但在打盹模式下
系統忽略喚醒鎖。
因此,如果您確實需要每 30 分鍾觸發一次,似乎AlarmManager.setAlarmClock
是唯一可接受的解決方案。 這可能會抵消所有打盹模式的節能...
順便說一句:似乎您可以使用adb shell dumpsys alarm
看到警報。
可能性:使用Firebase JobDispatcher
Firebase JobDispatcher 是一個用於在 Android 應用中安排后台作業的庫。 它提供了一個兼容 JobScheduler 的 API,適用於安裝了 Google Play 服務的所有最新版本的 Android(API 級別 14+)。
遇到和你一樣的問題,找了好久才解決。 但我沒有找到通用的解決方案。
三星設備的解決方案是可用的: 當應用程序關閉時,Android AlarmManager 在某些設備上不起作用
第一個答案不起作用,但第二個答案:)
您是否嘗試將您的應用添加到電池優化白名單? 正如一些新聞指出的那樣( 鏈接),華為有一些特殊的電池管理。
如果您想在每次計時器觸發時顯示通知,則可以使用后端服務器向 Android 用戶發送數據通知。
您需要將 Android 客戶端的 FCM 令牌保存在您的后端服務器中,服務器將負責向這些客戶端推送通知。
我知道只顯示通知有點復雜,但這就是Android系統的工作原理!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.