天道酬勤,学无止境

Push notifications are delayed in Android Doze mode

I am putting my Android device to sleep via adb:

adb shell dumpsys battery unplug
adb shell dumpsys deviceidle step <-- repeat until state is IDLE

Then I am sending the following JSON:

{
   "to":"dYA7tVZrfag:APA91bFVqddVcJHnr_7ZhgNC5iu4Y6XKcLbSVD4DlZgfjMKwKvZhJHiKR4DIzpMrX8zUL15C_adfyEcrlI9q6zOFqFs_zwNPTVIDm-v20ZK0qgagKYGaQE1OPBqdH4P_JHYIXOIS3gfn",
    "priority": "high",
    "data":{
        "test0":"test0",
        "test1":"test1"
    }
}

Result: Nothing... until I wake up the device, then I get all the messages queued. I am monitoring if messages are coming by putting logs in the method onMessageReceived().

I googled around and some people say using an older version of Android Studio or upgrading the version (9.4.0) of the FCM SDK would fix the problem. I've done both with no success.

Edit: This problem seem to only happen with the Samsung Galaxy S5

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Firebase message with high priority not waking device from Doze android 6+
    I have migrated my project from using GCM to use Firebase. Push notification comes through ok when the device is awake or been asleep recently but if I leave the device for say an hour, no push is sent until I wakeup the device. The Android docs say that if you need to wake a device to deliver a message, then use FireBase with priority set to high. It also says that device Admin apps are not subject to Doze restrictions, my app is a device admin app. I thought I would mention that when I migrated the project from GCM to FCM, I only specified the package name in the firebase console and not the
  • GCM-推送通知到达设备需要多长时间?(GCM - How long does it take for push notifications to reach the device?)
    问题 我对接收推送通知消息(使用GCM)的速度感兴趣。 发送的推送通知到达设备需要多长时间,特别是当我向大量设备(例如100,000甚至1,000,000)发送消息时? 回答1 GCM旨在在设备可用时立即发送通知。 如“消息的GCM生存期”文档所述: 在最佳情况下,如果设备已连接到GCM,则屏幕处于打开状态,并且没有节流限制,消息将立即发送。 如果您指的是平均速度,则在Google IO '15(01:57)中提到过: 如果设备在线,则平均..50毫秒。 还有一些因素可能会影响通知本身的传递。 其中一个示例是设置delay_while_idle标志(有关更多信息,请参阅Message文档的GCM生存时间)。 希望这可以使您的要求更加清楚。 干杯! :D PS:根据最近的IO '16,他们现在有Firebase Cloud Messaging,其核心是基于GCM。 小心检查一下。 ;) 回答2 从FCM接收任何PN(推送通知)的时间与目标设备的数量无关紧要。 然而,一件很重要的事情是所有设备都可能会或可能不会同时收到通知,因为在Android 6.0(Api 23)之后,打ze模式开始发挥作用,这限制了立即从FCM捕获PN。 因此,如果任何设备处于打ze模式,则它将收到延迟的PN。
  • Android 7.0 Doze is it stop all notification?
    I am trying to learn Android 7.0 but i see this comment. "When a device is on battery power, and the screen has been off for a certain time, the device enters Doze and applies the first subset of restrictions: It shuts off app network access, and defers jobs and sync" I dont understand exactly. İf it stop network in Doze mode ,how can i get whatsapp or email push message. Is it also restrict all in this mode? Thank you for comment
  • Android持久套接字连接规则(Android persistent socket connection rules)
    问题 我已经针对使用持久套接字的Android设备的自定义推送通知解决方案进行了一些测试。 我想分享我的发现并验证结果。 简单说明应用程序运行前台服务,并与服务器建立连接,并通过主动ping(间隔为10秒)来维护该连接。 如果曾经检测到连接已断开,则该应用将继续尝试无限期地重新连接。 服务器通过双工通道发送通知。 测试1: Pinging is done using a timer at 10 second intervals. Server sends notification every minute. Applications acquires wifi and wake locks. Duration : 8 hours Battery loss : ~14% 测试2: Pinging is done using AlarmManager at 10 second intervals. Server sends notification every minute. Application acquires only a wifilock Duration : 8 hours Battery loss : ~7% 假设:传入的网络数据包会自动唤醒CPU,因此不需要唤醒锁。 使用AlarmManager ping(而不是计时器)意味着我们不需要唤醒锁。
  • Doze mode and GCM notifications
    I've followed this stackoverflow post to set my Nexus 5 device to the 'IDLE' state with adb, after switching off the screen. > adb shell dumpsys battery unplug > adb shell dumpsys deviceidle step Stepped to: IDLE Despite this, I am able to see through my device logs the GCM notifications being received. 1-04 15:21:40.708 22138 26007 I GCM : GCM message com.sample.app 0:1446610899548646%82d6ec5bf9fd7ecd My understanding is that Doze mode will allow for certain maintenance windows where normal priority notifications are pushed in a batch, so I was not expecting to see such log entry. (I have
  • Android各版本特性
    Android6.0新特性 1.动态权限管理(Runtime Permissions) Android 6.0引入了动态权限管理,将标记为危险的权限从安装时权限(Install Time Permission)模型移动到运行时权限模型(Runtime Permissions) 2.指纹识别(Fingerprint Support) Android 6.0则在系统层面加入指纹识别,能提供原生指纹识别API,这不但降低了厂商开发指纹识别模块的成本,最重要的是原生指纹识别将会大大提升安卓手机的指纹识别支付安全性。 3.APP关联(App links) Android M加强了软件间的关联,谷歌在现场展示了一个例子,比如你的手机邮箱里收到一封邮件,内文里有以个Twitter链接,用户点击该链接可以直接跳转到Twitter应用,而不再是网页。 4.Android pay Android支付统一标准。新的M系统中集成了Android Pay。其特性在于简洁、安全、可选性。Android Pay是一个开放性平台,用户可以选择谷歌的服务或者使用银行的APP来使用它,Android Pay支持4.4以后系统设备,谷歌宣布Android Pay已经与美国三大运营商700多家商店达成合作,支付功能可以使用指纹来进行支付。 5.电源管理 Android6.0引入了下列特性来延长电池使用时间 6.存储
  • android各个版本的新特性
    首先看看最新版本Android 11 : https://www.zhihu.com/question/420186152 4.0 Ice Cream Sandwich(冰激凌三明治):2011年10月19日在香港发布。 安卓2.0版本安卓2.0版本 版本主要更新如下: 全新的UI;全新的Chrome Lite浏览器,有离线阅读,16标签页,隐身浏览模式等;截图功能;更强大的图片编辑功能;自带照片应用堪比Instagram,可以加滤镜、加相框,进行360度全景拍摄,照片还能根据地点来排序;Gmail加入手势、离线搜索功能,UI更强大;新功能People:以联系人照片为核心,界面偏重滑动而非点击,集成了Twitter、Linkedin、Google+等通讯工具。有望支持用户自定义添加第三方服务;新增流量管理工具,可具体查看每个应用产生的流量,限制使用流量,到达设置标准后自动断开网络。 4.1 Android 4.1Jelly Bean(果冻豆):2012年6月28日 新特性: 更快、更流畅、更灵敏;特效动画的帧速提高至60fps,增加了三倍缓冲;增强通知栏;全新搜索;搜索将会带来全新的UI、智能语音搜索和Google Now三项新功能;桌面插件自动调整大小;加强无障碍操作;语言和输入法扩展;新的输入类型和功能;新的连接类型。 4.2 Android 4.2 Jelly Bean
  • 推送通知需要很长时间才能到达(Push Notifications take too long to arrive)
    问题 我在 iOS 和 Android 的 adobe air 应用程序中遇到推送通知的奇怪问题。 我正在使用 Milkman Games 的 Easy Push ANE 和 One Signal 服务。 问题是通知确实会到达,但有时(随机),消息在发送后可能需要长达 15 分钟才能到达设备。 这对我的应用程序(出租车预订应用程序)至关重要,因为我依赖推送通知在出租车应用程序和用户应用程序之间进行通信。 因此,例如,如果用户叫车,出租车应用程序最多可能需要 15 分钟才能收到通知。 与 One Signal 支持人员交谈,根据他们的说法,一切都很好,如果我查看 One Signal 仪表板,通知几乎一直都是即时发送的。 这种延迟的原因可能是什么? 我该怎么做才能让事情变得更好? 谢谢你。 回答1 通常推送通知确实会很快到达。 但在一些罕见的情况下,我们看到它们被延迟: Android 设备上的通知延迟: 一些家用和商用 wifi 路由器会导致设备与谷歌 GCM 服务器的连接被关闭。 设备稍后重新打开连接并接收延迟通知。 (此处讨论:https://groups.google.com/forum/#!topic/android-gcm/Y33c9ib54jY) 某些自定义版本的 Android 操作系统具有省电设置,可能会导致通知延迟或忽略。 例如,索尼 Xperia 设备具有
  • 当Android 6.0在打ze模式下时,如何使Alarm Manager正常工作?(How to make Alarm Manager work when Android 6.0 in Doze mode?)
    问题 我是Google Play上两个闹钟应用的开发者。 我试图让他们使用Android 6.0。 但是,打Do模式使它不会响起。 我将它们放在白名单上,我放置了一个前台通知图标,我不确定我还能做些什么-在“打mode”模式下,“警报管理器”警报仍会被忽略。 不过,“时钟”应用程序(这是Google Play而不是AOSP应用程序)有所不同。 在“时钟”应用上启用警报后,“ adb deviceidle step”将始终显示为“ active”,而不会显示为“ idle”,“ idle_pending”或其他任何内容。 Android是否在这里欺骗,又给自己的应用程序提供了更多功能。 “拉一个苹果”? Google Play上的所有闹钟应用程序都将无法使用吗? 这里有些担心,这些都是高质量的应用程序,每个应用程序都花费了一年的兼职开发时间,对我来说是巨大的收入来源。 任何有关如何使它们工作的线索都将为您带来巨大的帮助。 设置AlarmManager的意图: Intent intent = new Intent(context, ReceiverAlarm.class); if (android.os.Build.VERSION.SDK_INT >= 16) { intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); } amSender
  • Android doze mode and foreground service
    I read many questions here about doze mode like Android doze mode, Android N Doze mode - how to keep background download and processing?, Wakelock and doze mode and many others. But in many replies, opinions is different. I can't test it by myself (emulator does not support my processor, and my only test device is android 5.1). I would like to know the next situation. I have an activity, which controls the media player. On devices with android 6.0 and higher it wouldn't work as expected cause of doze mode. As many solutions says to prevent doze mode it should start a service in separate
  • 在有/无部分/全部唤醒锁的情况下,打ze模式如何影响后台/前台服务?(How does doze mode affect background/foreground services, with/without partial/full wakelocks?)
    问题 这是一个简单的问题,因为在G +上(此处)有大量有关此的文章,而在官方文档中(此处)缺乏信息: 当设备进入“打ze”模式时,应用程序的服务会怎样? 带有/不带有部分/全部唤醒锁的后台/前台服务(绑定/未绑定,已启动/未启动)有什么作用? 例如,您要做什么才能创建在关闭设备屏幕时播放音频流的服务? 如果音频流不是来自本地文件,而是来自网络,该怎么办? 看到Google开发者提出了索赔: 已运行前台服务(带有相关通知)的应用不受打ze的限制。 -在那之后进行了很多讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么非常令人困惑。 回答1 具有当前正在运行的前台服务的进程应该不受Doze的影响。 绑定/未绑定,已启动/未启动以及唤醒锁不会影响此白名单过程。 但是,在Android M设备上存在一个问题,即当前台服务与顶级活动处于同一过程且未正确打do时,前台服务未正确列入白名单。 该修补程序可在AOSP上获得,并将包含在Android N的版本中。OEM可以将该修补程序集成到他们生产的任何Android M版本中。
  • How to make Alarm Manager work when Android 6.0 in Doze mode?
    I am a developer of two alarm clock apps on Google Play. I am trying to get them to work with Android 6.0. However, Doze mode makes it so they do not ring. I put them on the white list, I put a foreground notification icon up, I'm not sure what else I can do - when in Doze mode, the the Alarm Manager alarms are still ignored. The Clock app (which is a Google Play rather than AOSP app), however, is different. When the alarm is enabled on the Clock app, "adb deviceidle step" will always read "active" and never "idle", "idle_pending" or anything else. Is Android cheating here, giving its own app
  • MediaPlayer, Doze Mode, Wake Lock & Foreground Service
    I have read several posts regarding the new 'Doze' Mode in Android M, also the article on Android developers website : https://developer.android.com/training/monitoring-device-state/doze-standby.html yet I still have an issue with a Foreground Service correctly running on a phone (Android 6.0.1). Issue: I have a Service which handles playing music using a MediaPlayer object, the Service Implements onCompletion and onPrepared MediaPlayer interfaces. Pseudo code: public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer
  • Android 6.0打ze模式下的警报管理器问题(Alarm Manager issue in Android 6.0 Doze mode)
    问题 我制作了一个一直可以运行到Android 6.0的应用程序。 我认为这是打ze功能,不允许我的闹铃触发。 我使用sharedpreferences处理选项: //ENABLE NIGHT MODE TIMER int sHour = blockerTimerPreferences.getInt("sHour", 00); int sMinute = blockerTimerPreferences.getInt("sMinute", 00); Calendar sTime = Calendar.getInstance(); sTime.set(Calendar.HOUR_OF_DAY, sHour); sTime.set(Calendar.MINUTE, sMinute); Intent enableTimer = new Intent(context, CallReceiver.class); enableTimer.putExtra("activate", true); PendingIntent startingTimer = PendingIntent.getBroadcast(context, 11002233, enableTimer, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager sAlarm =
  • do睡模式下的网络访问(Network access in doze mode)
    问题 打do活动激活时是否可以使用网络访问? 如果我的应用程序忽略了电池优化功能,则它不会处于待机状态,但无论如何它都会受到打do的影响。 我有什么想念的吗? 回答1 不管您的应用程序是否忽略电池优化,在休眠模式下都将禁用网络访问。 从休眠模式唤醒设备并获得网络访问权限的唯一方法是将高优先级Google Cloud Message发送到您的应用程序。 编辑:可以让Android忽略您的应用程序的电池优化,从而有效地禁用应用程序的打ze模式。 但是,这需要使用setExactAndAllowWhileIdle方法(每15分钟最多唤醒一次)和用户交互,可以这样进行: Intent intent = new Intent(); String packageName = context.getPackageName(); PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (pm.isIgnoringBatteryOptimizations(packageName)) intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); else { intent.setAction(Settings
  • 打盹/待机功能如何影响位置更新?(How does Doze/Standby feature affect location updates?)
    问题 有谁知道当设备处于打盹状态或应用程序处于待机状态时,持有部分唤醒锁定的列入白名单的应用程序是否可以接收位置更新? Android 文档 (http://developer.android.com/training/monitoring-device-state/doze-standby.html) 仅说明 CPU 和网络被推迟,并没有提及对位置更新的任何影响(即来自 LocationManager )。 基于此,位置更新似乎不受 Doze/Standby 的影响,因此如果应用程序持有部分唤醒锁定(以保持 CPU 运行),则应用程序应该能够接收位置更新。 我已经实现并测试了它,发现一个应用程序似乎没有在 Doze 中接收位置更新,即使它有部分唤醒锁定并且被列入白名单。 有趣的是,当我将设备放在办公桌上过夜运行带有唤醒锁的应用程序时,早上电池几乎没电了,但是当重复使用没有唤醒锁的应用程序时,早上电池几乎充满。 所以看起来该应用程序一直在运行,但没有收到位置更新。 一点额外的背景:该应用程序用于车队跟踪,因此我们试图弄清楚应用程序是否可以运行后台服务,以便在使用电池供电时可靠地接收位置更新。 谢谢! - 汤姆 B。 回答1 是的,这似乎是 Doze 模式下的另一个未记录的限制,正如我的测试日志也显示的那样。 我的猜测是,在 Doze 中通常会关闭 GPS 等某些硬件功能
  • setExactAndAllowWhileIdle-从开发人员参考开始不准确(setExactAndAllowWhileIdle - is not exact as of developer reference)
    问题 API19上的AlarmManager具有setExact()方法来设置确切的警报。 确切的方法->如果我将闹钟设置为下午2:01,它将在下午2:01触发 在API 23-Marhsmwallow(6.0)上,有一个新方法setExactAndAllowWhileIdle() ,但从参考资料来看,它并不精确,因为它只会每分钟触发一次,而在低功耗空闲模式下则每15分钟触发一次。 确切!=每15分钟一次:-) 那么如何在6.0中使用AlarmManager实现准确的警报? 如果用户添加了提醒或日历约会,并且希望在事件发生前10分钟收到通知,则应该在事件发生前10分钟显示警报“准确”。 使用setExactAndAllowWhileIdle()似乎是不可能的。 参考链接:http://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int,long,android.app.PendingIntent) 回答1 那么如何在6.0中使用AlarmManager达到准确的警报? 欢迎您尝试setAlarmClock(),因为AFAIK不受打ze模式的影响。 否则, AlarmManager对您而言不是可行的选择。 即使将应用程序放在电池优化白名单上也无济于事
  • 检测打ze状态(Detecting Doze State)
    问题 是否可以检测设备何时进入打ze /待机状态? 我无法在Android文档中找到与可能的广播接收器或侦听器相关的任何信息,我可以启用或创建这些接收器或接收器以接收这些过渡的通知。 回答1 我相信您要查找的Intent是ACTION_DEVICE_IDLE_MODE_CHANGED。 从文档中: 当isDeviceIdleMode()的状态更改时广播的Intent。 此广播仅发送给注册的接收者。 isDeviceIdlemode的文档如下: 如果设备当前处于空闲模式,则返回true。 当设备闲置闲置并移动了足够长的时间,从而决定进入低功耗状态时,就会发生这种情况。 这可能涉及关闭对应用程序的网络访问之类的事情。 您可以使用ACTION_DEVICE_IDLE_MODE_CHANGED监视对此状态的更改。 退货如果当前处于活动设备空闲模式,则返回true,否则返回false。 这是主动应用空闲模式限制的时候。 如果设备处于长期空闲模式,但当前正在运行已解除限制的维护窗口,则它将返回false。
  • Android AlarmManager.setExactAndAllowWhileIdle() 和 WakefulBroadcastReceiver 不适用于某些新制造的低价设备(Android AlarmManager.setExactAndAllowWhileIdle() and WakefulBroadcastReceiver Not working in some new manufactured and low price devices)
    问题 我认为这个问题在stackoverflow被问过很多次,但仍然有很多人在努力解决它。 在我的 android 应用程序中,我必须每半小时唤醒一次设备以获取当前位置并将其发送到服务器。 为此,我将AlarmManager与setExactAndAllowWhileIdle()方法和WakefulBroadcastReceiver 。 它在几乎所有标准/流行设备中都可以正常工作,例如三星、LG(Nexus)、索尼、松下、联想、摩托罗拉、Micro max 等......但其他一些设备大多是中国设备不支持或不允许设备唤醒使用setExactAndAllowWhileIdle()从打盹模式。 我已经在leeco letV (Android OS 6.1)设备中leeco letV (Android OS 6.1)进行了测试,该设备不允许警报管理器在特定时间间隔内唤醒。 我在下面提到的代码部分: UserTrackingReceiverIntentService.java public class UserTrackingReceiverIntentService extends IntentService { public static final String TAG = "UserTrackingReceiverIntentService"; Context context
  • Alarm Manager not firing when app is killed on Android 7 (One Plus 3T)
    Since the introduction Doze Mode and App StandBy managing alarms have changed. The problem I'm facing is my alarm manager fires correctly on KitKat, Lolipop and Marshmellow devices but above API 23 it does not fire unless the app is in foreground or background. But if the app is killed, the alarms are stopped. Checked out Google Keep Application on my Android 7, turns out it does the same. But Google Calendar fires regardless of whether the app is killed or not. Done some reading and found out setExactAndAllowWhileIdle method on the alarm manager ensures to break the doze mode and trigger your