在深度空闲模式下未收到GCM高优先级消息

时间:2017-02-23 01:03:44

标签: android google-cloud-messaging

使用以下方法进入深度空闲模式后

adb shell dumpsys deviceidle force-idle

我正在尝试按照the documentation的建议,使用以下方式向设备发送高优先级消息:

  

{   “to”:“feoLl37Ses4:A ....... hDQU1OZKd”,     “优先”:“高”,     “通知”:{       “身体”:“这是身体。”,       “标题”:“这是标题”,       “icon”:“新”     }   }

未收到消息。 只有在我将设备状态更改为IDLE_MAINTENANCE后才会收到消息。

即使设备处于深度空闲模式,如何让设备接收消息?

3 个答案:

答案 0 :(得分:4)

我知道是迟到的回答,但万一有人遇到同样的问题。我遇到了同样的问题并花了几个小时尝试了几个解决方案,直到我得出结论你不应该使用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

通过这种方式,您将进入深度打盹模式,就像在实际案例中一样,您的推送将按预期接收。 注意,在调用步骤命令之前,您应该执行adb shell dumpsys battery unplug并关闭设备屏幕。

我的猜测adb shell dumpsys deviceidle force-idle更强,因为它会强制空闲模式,即使设备屏幕已开启。当他们说“你可以按照以下步骤测试打盹模式:”并告诉你使用force-idle命令时,它完全误导了官方的android doc。因为这种强制空闲不能像真正的那样工作,并且没有任何关于此的免责声明。

答案 1 :(得分:1)

如果您想从Doze状态唤醒应用(以便您可以接收消息),请使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()

执行命令时,您的应用程序进入了打盹模式

adb shell dumpsys deviceidle force-idle
  

Doze restrictions

     

以下限制适用于您在Doze中的应用:

     
      
  1. 网络访问暂停。
  2.   
  3. 系统会忽略唤醒锁定。
  4.   
  5. 标准AlarmManager警报(包括setExact()和setWindow())将延迟到下一个维护窗口。
  6.   
  7. 如果您需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
  8.   
  9. 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。
  10.   
  11. 系统不执行Wi-Fi扫描。
  12.   
  13. 系统不允许同步适配器运行。
  14.   
  15. 系统不允许JobScheduler运行
  16.         

    网络访问的Doze限制也可能会影响您的应用,特别是如果应用依赖于实时消息,例如   痒痒或通知。如果您的应用需要持久性   连接到网络以接收消息,您应该使用Firebase   如果可能,请使用云消息传递(FCM)。

         

    为了帮助安排警报,Android 6.0(API级别23)介绍了   两个新的AlarmManager方法:setAndAllowWhileIdle()和   setExactAndAllowWhileIdle()。使用这些方法,您可以设置警报   即使设备处于打盹状态,它也会触发。

答案 2 :(得分:1)

您必须使用WakefulBroadcastReceiver,它使用方法startWakefulService()来启动执行工作的服务。此方法与startService()相当,只是WakefulBroadcastReceiver在服务启动时持有唤醒锁。使用startWakefulService()传递的意图包含额外的识别唤醒锁定。

第1步: 扩展WakefulBroadcastReceiver而不是BroadcastReceiver。

第2步: onReceive()

中的startWakefulService

如有任何疑问,请与我们联系。