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

Udi*_*dan 17 android google-cloud-messaging

进入深度空闲模式后,使用:

adb shell dumpsys deviceidle force-idle
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照文档的建议向设备发送高优先级消息,使用:

{"to":"feoLl37Ses4:A ....... hDQU1OZKd","priority":"high","notification":{"body":"This is the body.","title":"this是标题","图标":"新"}}

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

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

Jor*_*uci 5

我知道答案很晚,但以防万一有人遇到同样的问题。我遇到了同样的问题,并花了几个小时尝试了几种解决方案,直到我得出结论,您不应该使用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
Run Code Online (Sandbox Code Playgroud)

这样,您将像在真实情况下一样进入深度打盹模式,并且您的推送将按预期收到。 请注意,在调用 step 命令之前,您应该执行adb shell dumpsys battery unplug并关闭设备屏幕。

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


Rey*_*cia 1

如果您想将应用程序从打瞌睡状态唤醒(以便您可以接收消息),请使用 setAndAllowWhileIdle()setExactAndAllowWhileIdle()

\n\n

当您执行命令时,您的应用程序进入打瞌睡模式

\n\n
adb shell dumpsys deviceidle force-idle\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

打瞌睡\n限制

\n\n

以下限制适用于您的应用程序在打瞌睡时的情况:

\n\n
    \n
  1. 网络访问被暂停。
  2. \n
  3. 系统忽略唤醒锁。
  4. \n
  5. 标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护时段。
  6. \n
  7. 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  8. \n
  9. 使用 setAlarmClock() 设置的警报继续正常触发 \xe2\x80\x94 系统在这些警报触发前不久退出打瞌睡状态。
  10. \n
  11. 系统不执行 Wi-Fi 扫描。
  12. \n
  13. 系统不允许同步适配器运行。
  14. \n
  15. 系统不允许JobScheduler运行
  16. \n
\n\n

对网络访问的打瞌睡限制也可能会影响您的应用程序,特别是当应用程序依赖于实时消息(例如\n 痒痒或通知)时。如果您的应用需要与网络保持\n 持久连接才能接收消息,则应尽可能使用 Firebase\n 云消息传递 (FCM)。

\n\n

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

\n
\n