Bootstrap

Android 锁屏后Socket长连接踩坑总结

最近项目中遇到手机休眠后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的定时操作

详细请参考:

;