为了节省电量,Android系统在一段时间不操作后,会进入休眠状态,Android6.0之后更是引入了Doze和Standby两种省电模式,达到进一步省电的目的。在这些省电模式下,会挂起一些设备的电源,限制网络访问和一些其它的后台操作,因此休眠自然也会影响到后台的推送服务。
Android休眠机制
由于Android系统是基于Linux内核的,所以Android系统地休眠机制也继承自Linux,并且在此基础上增加了唤醒锁机制。
唤醒锁(WakeLock)
wake_lock 在Android的电源管理系统中扮演一个核心的角色。wake_lock是一种锁的机制,只要持有锁,系统就无法进入休眠,这个锁可以被用户态程序和内核获得。唤醒锁可以是有超时的或者是没有超时的,超时的锁会在超时以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠。
Doze和App Standby
从Android 6.0 (API level 23)开始,Android提供了两个节电功能用来增加电池的续航时间。Doze 可以在设备长时间不使用时,通过延迟后台CPU和网络的活动来减少电池的消耗;App Standby将延迟没有交互的app的网络活动。
Doze:
手机在不插电熄屏的状态下,静止不动一段时间(大概1个小时)后,会进入IDLE状态,此机制无视WeakLock,就是说即使持有WeakLock,但在满足上述条件后还是会进入IDLE状态。此状态下将限制应用的网络访问,GPS以及WIFI扫描,推迟包括JobScheduler、Syn、Alarm等操作。在IDLE状态下一段时间后,系统会退出该状态,进入到IDLE_MAINTENANCE状态,此状态下将运行之前推迟的那些操作,并且允许接入网络。在这之后系统又会回到IDLE状态,并且随着休眠时间的增长,IDLE状态下停留的时间也越来越长,进入到IDLE_MAINTENANCE状态的频率也将越来越低,直到维持在一个稳定值。
App Standby:
在App Standby模式下Android系统会使一个用户长时间未使用的应用进入空闲状态。具体来说,当用户长时间未与应用发生交互操作或以下任意场景都未出现时,Android系统就会使应用进入空闲状态:
1.用户主动启动应用
2.应用存在前台进程(前台活动或前台服务,或有组件被另一前台活动及服务使用)
3.应用创建了一个用户可见的锁屏界面上或者是收入Notification tray中的Notification
当用户给Android设备接入充电电源时,Android系统会将所有处于Standby状态的应用释放,允许它们自由的访问网络并执行所有Standby期间暂停的Jobs和Sync。如果应用长时间处于空闲状态,Android系统将会允许处于空闲状态的应用以大约一天一次的频率访问网络。
唤醒方法:
1、在执行发送心跳包、重连、拉取推送内容等操作时使用PARTIAL_WAKE_LOCK,防止在执行重要操作时CPU休眠,并在使用完成后释放,以便休眠;
2、心跳定时器使用AlarmManager,在设置闹钟时使用带WAKEUP后缀的type,在6.0以后使用setExactAndAllowWhileIdle或setAndAllowWhileIdle方法设置闹钟,以便能在Doze模式下唤醒;
3、在Doze模式下,alarm闹钟会被推迟,网络会被限制,可以通过申请加入电池优化白名单的方法修复;申请方法为在mainifest中增加REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,在代码中使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的Intent来弹出申请对话框。
4、部分手机即便使用了上述方法也会存在网络断开、线程睡死等现象,只能自行适配,看看是否有独特的后台管理机制与省电策略。
关于消息推送服务,想要了解更多也可以咨询极光。
极光推送官方链接:https://www.jiguang.cn/push
0条评论