10月30日22点整,苹果以“Theres more in the making”为主题的发布会在纽约布鲁克林音乐学院正式举行。在这次发布会中,苹果终于对其2个许久未更新的产品线MacBook Air与Mac mini进行了更新,除此之外,还发布了“世界上最好的AR设备”——新款iPad Pro。
本篇转自Dynamic_2018的博客,主要讲解了关于 WorkManager的相关知识,一起来看看!希望大家喜欢。
线程池、广播、前台任务这里暂时不提,主要看一下新出的workmanager,从图中可以看出workmanager的使用条件任务可以适当延迟的,即task没有闹钟那种强时效性。
如果必须要准时执行的任务比如股票每日开市提醒只能强行唤醒系统,但是也有的是不是要求时间这么准确的,比如每隔2天弹一个notification提示打开app啥的,这种实效性不那么高的就可以换成jobservice。
这个是android6.0后出来的,6.0+的设备上都有这个,目的是为了省电。简单的说就是手机系统发现一段时间用户都没有在用手机了,就会进入省电模式,期间不会处理alarm、网络状态等,等省电了一段时间后再给一小段时间让所有应用统一处理alram等task,然后又进入省电状态。如果中途一直没有亮屏、充电等表示用户开始用手机了的操作,doze的省电周期会越来越长,如上图。
老实说,按照国人的习惯,白天手机想进入doze,基本上上不可能的。没有谁会好几个小时不碰手机吧。所以基本上都是晚上进入doze,这也说明了为啥早上亮屏的瞬间手机好多app会在同一时间弹出notification(亮屏就退出了doze,被延迟的alram马上开始工作)。
使用jobservice的优势就是doze下,不会唤醒系统,耗电量会减小。耗电量减小到一定程度,才能达到googleplay的推荐要求;在国内,两种类型差不多的app,用户通过电量消耗统计软件发现耗电量低的那个app,应该会对它更有好感吧(卸载也是先卸载竞争对手的app 哈哈)。
后面发现印象笔记的android-job已经实现了类似的功能,地址如下所示:
这个是周期执行有关的参数,离周期末尾多久这个job应该被执行,最低5分钟。
非周期性的任务,执行失败后被重新调度需要等待的时间,配合着下面的策略使用。
一些二级条件吧,如果没有强制要求,会在deadline时忽略这些条件执行job
需要等待的网络状态,是netWorkType的枚举,有好几种,类似wify 、流量等,默认是不需要关心网络状态。
这个就是前面提到的那个参数,如果设为false,当job到deadline还没执行的时候,就可以抢救一下。
带的额外参数,必须是这种类型,类似bundle。可以在onRunJob方法那里通过传过去的param取出来。
使用起来还是很方便的,workmanager.enque(workRequest)就可以了,看起来类似google之前出的volley的风格,不知道是不是同一批程序员开发的哈哈。
需要注意的是队列里面任务(还在等待调度 未执行的那种)不能超过100个,不然会crash,这是workmanager代码的限制
workermanager的周期任务,有时不能取消掉之前放到队列的任务。通过cancleByTag也不行,这个在stackoverflow和github上面的issue也看到有人提过,而且确实回复是个bug,应该是alpha版还是有些问题的。
既然周期任务有坑,我们也可以采用一次性任务开启下一个一次性任务,像链表那样。而且可以避开周期任务里面源码对周期设置最小15分钟的限制,不过一般也没那么流氓要隔几分钟就唤醒吧。
但是使用一次性任务循环触发,发现在小米上测试,打开app退到后台时,alarmmanager android-job workmanager正常,杀掉app,workmanager就不行了;使小米达到doze的条件,再亮屏,anroid-job也不行了。在小米上暂时只有alramanager适用(如果有哪位朋友发现小米上用workmanager有方法可以避开这个坑,请分享一下)。
还有就是前面提到的,要避开queue里面出现100个待调度的job的case。
最后的做法定时任务使用alrammanager,等收到alram广播后交给worker处理;网络状态监听任务直接再接收到广播后交给worker处理。保证定时,但是收到广播放到队列里面不像之前那样接收到广播就串行马上执行了,等系统决定统一处理。