1421601887bc267602ff6305c4408e34
Android后台保活手段总结 (下篇)

Android后台保活手段总结 (下篇)

由于众所周知的限制,在国内无法使用GCM推送服务,想要自己搭建推送服务的话,有两个绕不开的技术点,一个是TCP长连的保活,另一个就是后台进程的保活。上一篇文章介绍了后台进程的保活手段,本篇主要介绍Android新特性对后台进程和TCP长连的影响

从 Android 6.0(API 级别 23)开始,Android 引入了DozeStandby两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。低电耗模式通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电池消耗。应用待机模式可推迟用户近期未与之交互的应用的后台网络 Activity。

Doze

进入Doze模式的条件,要满足:

  1. 设备未接入电源
  2. 设备处于静止状态
  3. 平米关闭

一旦设备进入Doze模式,应用将无法访问网络。JobScheduler和Standard Alarms也会被推迟执行。但是对于Alarm,可以使用 setAndAllowWhileIdle()setExactAndAllowWhileIdle() 绕过这一限制。

系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。

需要特别澄清的是,Doze模式并不会积极回收后台Service,所以不涉及到后台进程保活。Doze最麻烦的地方在于,网络通信将不可用,也就是说后台TCP长连将无法及时得到消息推送。虽然setAndAllowWhileIdlesetExactAndAllowWhileIdle可以暂时性的退出Doze模式,但由于Google的限制,9分钟内只能触发一次。而有些移动网络下,往往4分钟左右没有心跳的话就会触发NAT超时,因此无法用这种手段维系TCP长连,在国内无法使用GCM的情况下,一旦进入Doze模式,可能只有使用主动轮询的方式获取推送消息。

应用可以通过adb进入Doze模式测试是否能够正常运行(关闭屏幕,并多次重复第二条命令)

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step

Standby

当用户有一段时间未触摸应用时,系统会让应用进入到Standby模式,直到:

top Created with Sketch.