最近项目中遇到手机休眠后Socket心跳发不出去的问题,折腾许久终于解决,所以做个记录。

每种手机都有自己的休眠策略,Android手机在长时间不操作时会自动让CPU进入睡眠状态,这就导致除AlarmManager外,Android Timer / Handler / Thread.sleep()这些方式实现的定时任务都无法正常运行。

在安卓6.0之后,谷歌又加入了全新的Doze模式,就是说当屏幕关闭一段时间后,系统会对CPU,网络、Alarm等活动做出限制,从而延长电池寿命
但是系统会间歇性退出Doze模式一小段时间,让应用完成他们的同步操作和Alerm任务。

Android应用处于Doze模式下时会受到以下限制:
1.网络访问被挂起
2.Wake Locks被无视
3.AlarmManager创建的Alarms将被推迟到下一个维护窗口,通过setAndAllowWhileIdle()以及setExactAndAllowWhileIdle()设置的Alarms将会在Doze模式下正常执行,同时通过setAlarmClock()设置的Alarms也会正常执行---Android系统将会在设定时间之前自动退出Doze模式
4.Android系统将会停止执行Wi-Fi的扫描
5.Android系统将会停止Sync Adapter的同步操作
6.Android系统也会停止JobScheduler的定时操作

详细请参考:Android开发技巧(三)—— 创建定时任务https://blog.csdn.net/qq_41205771/article/details/104446141

Doze模式:

Android的Doze模式https://www.jianshu.com/p/d39ac63b445b

所以,要实现手机休眠后Socket正常发送心跳,目前有三种方案:

1.采用AlarmManager进行定时

setAndAllowWhileIdle()以及setExactAndAllowWhileIdle()设置的Alarms在Doze模式仍然能够正常执行,并且执行时能够自动唤醒CPU。采用AlarmManager进行定时,到达设定的心跳发送时间后,AlarmManager可以唤醒CPU完成心跳发送的操作。但是经过OPPO HUAWEI等国内厂商实测发现,AlarmManager最短定时时间为5分钟,小于五分钟的定时任务,休眠之后一律会延迟到五分钟在执行。所以此种方式只适合心跳时间大于5分钟的场景,我们项目心跳时间最长为2分钟,所以未采用此方案。

详细测试结果参考:

Android Doze模式适配实验记录https://blog.csdn.net/gaoxiaoweiandy/article/details/95778748?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-3.queryctr&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-3.queryctr&utm_relevant_index=6AlarmManager使用请参考:

定时任务AlarmManager的使用注意事项https://blog.csdn.net/sp_wei/article/details/83146655

2.添加白名单

添加Doze白名单后,应用不受Doze的影响,即Doze不会对该应用进行限制,如该应用的Job、Alarm、网络等不会进行限制。不过除了Android的Doze白名单,各厂商基本也都有自己的白名单,俩个都需要添加,否则不起作用。

Android 8.1 Doze模式分析(五) Doze白名单及Debug方式https://blog.csdn.net/FightFightFight/article/details/81392488

Doze白名单添加参考:

Doze和App Standby模式下的Android应用适配https://www.jianshu.com/p/f044ce3f5913

各厂商白名单基本在设置->电池->电池优化,需要引导用户手动设置。

查看Doze白名单命令:

adb shell dumpsys deviceidle whitelist

3.WakeLock唤醒锁+Doze白名单方式

唤醒锁使用请参考:

Android中的WakeLock使用https://blog.csdn.net/u012398902/article/details/52838386

持有唤醒锁的应用,锁未释放之前,CPU不会进行休眠。此方式需同时添加Doze白名单和各厂商电池优化白名单,不在Doze白名单的应用,持有的唤醒锁会被无视。不添加各厂商电池优化白名单,实测还是会休眠。

查看Android WakeLock唤醒锁持有列表命令:

adb shell dumpsys "power|grep -i wake"

后记:笔者采用了第三种方案,实测唤醒锁有时会失效,打算同时使用AlarmManager,休眠时定时检测唤醒锁状态,待测试效果。

Android 锁屏后Socket长连接踩坑总结相关推荐

  1. Android 锁屏后handler计时失效

    目录 问题背景 handler失效的原因 排查了解到Doze机制 锁屏后计时解决方案 问题背景 需要记录用户播放音频的时长,我在一个service中开启handler,每隔一秒用户正在播放,将播放时长 ...

  2. 华为手机锁屏后显示无法连接服务器,锁屏状态可以远程连接服务器

    锁屏状态可以远程连接服务器 内容精选 换一换 只有运行中的云服务器云主机才允许用户登录.Windows操作系统用户名"Administrator".首次登录云耀云服务器,请先通过& ...

  3. android 熄屏后socket,手机熄屏再唤醒后 websocket 的重连方法。

    使用websocket长连接进行实时通信,在制作客服聊天或是必要的数据实时更新需求中是很好的选择,毕竟轮询大家都懂的 但是websocket服务端通常为了保证资源的有效利用,会加入心跳机制,当超过心跳 ...

  4. 华为锁屏后微信无法连接服务器,怎么解决华为p9锁屏收不到微信信息【教程详解】...

    相信不少人都已经入手了华为p9这不手机.但是有用户反映,华为p9锁屏时会有收不到 微信 信息的情况.遇到这个问题的时候我们要怎么解决呢?今天,小编为大家分享解决华为p9锁屏收不到微信信息教程,同样适用 ...

  5. android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)

    android 5.1 系统中 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int polic ...

  6. Android 锁屏后Service服务保活(支持9.0)

    最近遇到个问题: 后台Service启动正常启动后,锁屏状态下大概80秒左右Service就被暂停了(并没有被杀死),唤醒屏幕后就继续执行. 解决方法: Service启动时创建一条通知,与其绑定,这 ...

  7. android 锁屏后定时器,iOS锁屏或者后台计时器定时解决方法

    我们知道,当程序进入后台时,计时器就会暂时停止,当重新进入程序时,计时器又会重新开始,有时候,我们需要在程序进入后台时,计时器依然能够计时,所以,就想到了一种解决方案,利用进入后台和前台的时间差来让计 ...

  8. 手机锁屏后有时收不到微信通知,有时又能收到是怎么回事?

    手机锁屏后有时接不到微信通知,有时可以收到微信通知.出现这种情况的原因有两种,一种是设置不当,另外一种是运营商的网络原因. 微信通知接收设置 苹果手机和安卓手机对微信消息推送的设置是不同的.相比之下, ...

  9. android端 socket长连接 架构

    看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...

  10. Android 基于高德地图的锁屏后定位和轨迹自动纠偏(离线版)

    目录 一.后台如何持续获取定位 1.后台以及锁屏后持续定位异常的原因以及应对方案探索 2.后台持续获取定位失败的应对方案 二.对坐标点进行加工处理 (1).为什么要加工处理 (2).如何加工处理 本文 ...

最新文章

  1. 【旧文章搬运】Win7可变对象头结构之InfoMask解析
  2. 二进制安位处理_处理器与安​​全性之间的联系是什么?
  3. 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
  4. 由于html元素加载导致的问题
  5. if-else多级嵌套,输入3/4/5个数寻找最大值(太多了容易乱!!!)
  6. 谷歌用算力爆了一篇论文,解答有关无限宽度网络的一切
  7. android ndk 智能指针,智能指针与弱引用详解
  8. nb模块不能接收公网消息_物联网连接技术之NB-IOT无线技术介绍
  9. 小米抢购软件_【晓满晓满晓】今日科技新鲜事:小米11、鸿蒙os、摩拜单车
  10. android日记论文摘要,毕业设计(论文)-基于android的日记本的设计与开发.doc
  11. 【云原生】Kubernetes编排工具精讲
  12. 基于模糊PID的柴油机调速系统
  13. 当Java虚拟机遇上Linux Arena内存池
  14. 似然函数取对数的原因
  15. 关于SWOT,你了解多少?
  16. No converter for [class XXX] with preset Content-Type ‘null‘
  17. python web ip_Python爬虫IP代理教程,让你不再为IP被封禁发愁!
  18. mybatis中association的使用
  19. 大佬们都在用的几款简单易用的文本编辑器
  20. 快速傅里叶变换(FFT)c语言实现

热门文章

  1. 计算机中常用的数学知识
  2. PTA甲级模拟第六弹:1156-1159
  3. GIS应用技巧之景观格局分析(三)
  4. SQL-Server笔记
  5. python装饰器代码的简单记录
  6. 7-11 How Long Does It Take(25 分)
  7. 2011广告联盟排名,最好的广告联盟推荐
  8. python_d05
  9. 支付宝提现回调地址问题
  10. 文明与征服汉尼拔阵容技能推荐