使用以下方法进入深度空闲模式后
adb shell dumpsys deviceidle force-idle
我正在尝试按照the documentation的建议,使用以下方式向设备发送高优先级消息:
{ “to”:“feoLl37Ses4:A ....... hDQU1OZKd”, “优先”:“高”, “通知”:{ “身体”:“这是身体。”, “标题”:“这是标题”, “icon”:“新” } }
未收到消息。 只有在我将设备状态更改为IDLE_MAINTENANCE后才会收到消息。
即使设备处于深度空闲模式,如何让设备接收消息?
答案 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中的应用:
- 网络访问暂停。
- 系统会忽略唤醒锁定。
- 标准AlarmManager警报(包括setExact()和setWindow())将延迟到下一个维护窗口。
- 如果您需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
- 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。
- 系统不执行Wi-Fi扫描。
- 系统不允许同步适配器运行。
- 系统不允许JobScheduler运行
醇>网络访问的Doze限制也可能会影响您的应用,特别是如果应用依赖于实时消息,例如 痒痒或通知。如果您的应用需要持久性 连接到网络以接收消息,您应该使用Firebase 如果可能,请使用云消息传递(FCM)。
为了帮助安排警报,Android 6.0(API级别23)介绍了 两个新的AlarmManager方法:setAndAllowWhileIdle()和 setExactAndAllowWhileIdle()。使用这些方法,您可以设置警报 即使设备处于打盹状态,它也会触发。
答案 2 :(得分:1)
您必须使用WakefulBroadcastReceiver,它使用方法startWakefulService()来启动执行工作的服务。此方法与startService()相当,只是WakefulBroadcastReceiver在服务启动时持有唤醒锁。使用startWakefulService()传递的意图包含额外的识别唤醒锁定。
第1步: 扩展WakefulBroadcastReceiver而不是BroadcastReceiver。
第2步: onReceive()
中的startWakefulService如有任何疑问,请与我们联系。