2017-02-23 39 views
17

沒有收到使用進入深度空閒模式之後:GCM高優先級消息在深度空閒模式

adb shell dumpsys deviceidle force-idle 

我嘗試發送器件提供高優先級的消息,由the documentation的建議,使用:

{ 「到」: 「feoLl37Ses4:甲....... hDQU1OZKd」, 「優先」: 「高」, 「通知」:{ 「本體」: 「這是身體」。 , 「title」:「這是標題」,未接收到的 「新」 } }

消息:「圖標」。 只有在將設備的狀態更改爲IDLE_MAINTENANCE後,纔會收到消息。

即使處於深度閒置模式,我如何才能讓設備接收消息?

+0

你正在使用什麼設備?你有沒有安裝任何任務管理器,可能會在電話閒置時殺死谷歌播放服務? –

+0

在HTC設備上做了一些測試。它沒有安裝任何任務管理器應用程序。 –

回答

1

如果您想從打盹狀態喚醒應用程序(因此您可以接收消息)使用,setAndAllowWhileIdle()setExactAndAllowWhileIdle()

您的應用程序去打盹模式,當你執行的命令

adb shell dumpsys deviceidle force-idle 

Doze restrictions

以下限制適用於您的應用程序,而在打盹:

  1. 網絡訪問被暫停。
  2. 系統忽略喚醒鎖。
  3. 標準的AlarmManager報警(包括setExact()和setWindow())被推遲到下一個維護窗口。
  4. 如果您需要設置在瞌睡時觸發的警報,請使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
  5. 用setAlarmClock()設置的警報繼續正常激活 - 系統在這些警報激發之前不久就打瞌睡。
  6. 系統不執行Wi-Fi掃描。
  7. 系統不允許同步適配器運行。
  8. 該系統不允許的jobscheduler運行

網絡接入打盹的限制也可能影響到你的應用程序,特別是如果應用程序依賴於實時信息,如 發癢或通知。如果您的應用需要連接到網絡的持續 接收消息,則應儘可能使用Firebase 雲消息傳遞(FCM)。

爲了幫助調度報警,在Android 6.0(API級別23)推出 兩個新AlarmManager方法:setAndAllowWhileIdle()和 setExactAndAllowWhileIdle()。通過這些方法,即使設備處於打盹狀態,您也可以設置將會觸發的警報 。

1

您必須使用WakefulBroadcastReceiver,它使用startWakefulService()方法啓動執行該工作的服務。該方法與startService()相似,只不過WakefulBroadcastReceiver在服務啓動時持有喚醒鎖。與startWakefulService()一起傳遞的意圖包含一個額外的標識喚醒鎖。

步驟1: 擴展WakefulBroadcastReceiver而不是BroadcastReceiver。

第2步: startWakefulService中的onReceive()

請讓我知道任何疑問。

+0

我不認爲WakefulBroadcastReceiver會提供幫助,因爲它有助於在收到廣播後讓設備保持清醒狀態。 –

0

我知道是遲到的答案,但只是爲了防止任何人遇到同樣的問題。我遇到了同樣的問題,並花了幾個小時嘗試幾種解決方案,直到我得出結論,您不應該使用adb shell dumpsys deviceidle force-idle進入深度閒置模式來測試您的推送通知,因爲它們將不會被接收(您的設備被強制進入深度空閒模式,除非您執行unforce命令)。

如果您想在深度閒置模式下測試您的高優先級推送通知,請改用adb shell dumpsys deviceidle step來完成所有步驟,直到您進入深度閒置模式。這是一個例子。

adb shell dumpsys deviceidle get light 
ACTIVE 
adb shell dumpsys deviceidle step 
Stepped to deep: IDLE_PENDING 
adb shell dumpsys deviceidle get light 
INACTIVE 
adb shell dumpsys deviceidle step 
Stepped to deep: SENSING 
adb shell dumpsys deviceidle step 
Stepped to deep: LOCATING 
adb shell dumpsys deviceidle step 
Stepped to deep: IDLE 
adb shell dumpsys deviceidle get light 
OVERRIDE 
adb shell dumpsys deviceidle get deep 
IDLE 

這樣,您將進入深度打盹模式,就像在真實的情況下一樣,您的推送將按預期方式收到。 通知在調用step命令之前,您應該執行adb shell dumpsys battery unplug並關閉設備屏幕。

我的猜測adb shell dumpsys deviceidle force-idle更強大,因爲即使設備屏幕打開,它仍強制空閒模式。當他們說「你可以通過以下步驟測試打盹模式:」並且告訴你使用force-idle命令時,這是完全誤導官方android doc的。因爲這種強制怠速不是真正的效果,所以沒有任何聲明。