3

我正在使用AlarmManager在後臺生成一些服務的應用程序工作。時序對於我們的應用程序非常重要,並且功能不能等待下一個維護時段發生。 要求用戶白名單應用程序不是一個問題,但不解決暫停警報的問題。電池消耗也不是一個大問題。打盹模式處理

我想到的第一個可能的解決方案是生成一個始終運行的前臺服務來處理重新計劃服務而不是AlarmManager,但這樣做會轉移我們應用程序的大部分基礎結構,並且對我們來說不可行。

我剛剛實施的當前修復程序是發送高優先級推送通知,並在接收消息時,採取完全喚醒鎖定並打開屏幕以打破打盹模式。

我想知道是否有其他方式打破打盹模式?也可以不採取喚醒鎖?實施上述解決方案可能會產生一些影響嗎?

P.S.我正在使用UrbanAirship進行推送通知。

+0

*也可以不採取喚醒鎖?*是可能的嗎? –

+0

在沒有打開屏幕的情況下接收高優先級推送通知是否有可能打瞌睡?我正在考慮不在托盤上顯示通知,但沒有這個功能,打開屏幕會更奇怪。 –

+0

我試圖用FCM消息解決類似的問題。但它會在很短的時間內喚醒我的應用程序。你有沒有一個好的解決方案? –

回答

2

您不能「休息」/停止/禁用打盹模式,但有些方法可以在設備打瞌睡時臨時解除應用程序的限制。

  1. 高優先級FCM消息。

FCM高優先級的消息讓你可靠地喚醒你的應用程序訪問網絡,即使用戶的設備處於打盹或應用程序是在應用待機模式。在打盹或應用待機模式下,系統發送消息併爲應用臨時訪問網絡服務和部分喚醒鎖,然後將設備或應用返回到閒置狀態。

高優先級FCM消息不會影響打盹模式,也不會影響任何其他應用程序的狀態。這意味着您的應用可以使用它們進行有效通信,同時最大限度地降低整個系統和設備的電池影響。

  1. andAllowWhileIdle報警設置AlarmManager。

打盹,特別容易影響AlarmManager報警和定時器管理活動,因爲在搭載Android 5.1(API級別22)以下時,報警系統處於打盹不火。

爲了幫助安排警報,Android 6.0(API級別23)引入了兩個新的AlarmManager方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。使用這些方法,即使設備處於打盹狀態,您也可以設置即將觸發的警報。

請注意,打盹模式下兩次報警之間的最小間隔時間爲9分鐘。


對於這兩種情況下,你的應用程序恢復到全功能(意思是:休眠限制不適用)的時間很短,當時間結束時,操作系統將恢復瞌睡限制。

請注意,您不需要在這些「喚醒」期間打開屏幕來執行代碼。

我手邊沒有資料來源,但我相信我這個短期我的名字是~10秒。

Source & additional reading

+0

你好,蒂姆,我有一個類似的問題,如果你有時間,請看看它。這對我來說真的很有幫助。 https://stackoverflow.com/questions/44079858/dealing-with-android-doze-mode-on-my-ble-monitoring-app-while-users-sleeping –