大家是不是经常被产品小姐姐问到进程保活问题,如果你说实现不了小姐姐马上就要怼你了,那人家微信是怎么做到的。面对这种情况我们机智的程序员当然要挺身而出一套一套先把她说愣,然后再把小姐姐抱回家从此过上xing福的生活。
OK,空口无凭,目标有了说干就干,接下来我们来分析一下怎么做到。我们知道一个service以start的方式开启的话是不会受activity生命周期影响的,也就是说我们只要提升service优先级为前台进程按理说就能保活了啊,程序员A笑了笑,这个不要太简单,我先来试试,于是程序员A啪啪啪的三分钟代码就写好了,代码如下:
小组成员纷纷带着疑问的眼神盯着小A的pixel手机看,产品小姐姐露出了崇拜的眼神,看着ide不光在按返回键退出的时候打着Log,就连手动清除进程的时候Log都在,小姐姐感觉自己恋爱了,慢慢地往程序员A身上靠去。这时候程序员B及时制止,能否拿我手机试试?小B掏出了他的小米手机,程序一跑起来小B就手动杀了下进程,Log瞬间停止了。。。嘴角露出了一丝得意的微笑,小样,就你这技术还想抱得美人归?小B立马抢风头挡住小姐姐解释道:只有部分系统比如谷歌原生的系统这样做才能做到前台进程不会被清理掉,对于国产系统来说,早就对这个方式进行了限制。小姐姐娇弱地问到,那应该怎么办呢。小B知道自己不是完全有信心,但是也只能硬着头皮上了,毕竟小姐姐那么看好自己,不能让人家失望,就算颜面扫地也要赌一把。小B略作思考,回忆了一遍最开始学习Android的时候广播方面的知识,广播是独立于context存在的一个神奇物种,瞬间一丝白光闪过,小B优(bi)雅(shi)地推开小A,说让我来试试吧,啪啦啪啦三分钟写完,小B的代码如下:
小组成员纷纷朝小B代码看去,噢,原来小B是利用了进程被杀了广播还能开启的特性,在进程被杀以后开启了广播,然后广播又打开了service,这样确实有一定可行性。小B将程序一运行ide里就开始打log,然后小B深呼吸了一口气,将进程杀掉,奇迹出现了,ide里居然还在打Log!这说明了什么,说明了小B做到了在用户在任务栏清除应用以后进程仍然存在。小姐姐紧张得不行,眼看着就要倒小B身上了。说时迟那时快,小C拦在了小B前面,说到,那如果用户从设置里强制杀掉进程呢,你这进程还能活着么?人家微信可以做到了就算你在设置里杀掉了进程依然能存活,你杀一个试试?小B有些担心但是也只能厚着脸皮试试了,他有气无力地进了设置里强制把进程一杀,果然log停止了,停止了。。。
这个时候小C首先解释了一番,说我们可以利用双进程保活机制,用户每次只能杀掉一个进程,我们在用户杀掉其中一个的时候我们利用另一个进程来打开刚刚被杀掉的进程,这样就能做到进程保活了。小C说完新建了2个service,然后指定其中一个service在新开的进程中运行,将2个service互相绑定,最后加上系统的定时器JobService,每过100ms检查我们的本地和远程服务是否已开启,如果没有开启的话重新打开进程,小C的核心代码如下:
代码运行起来以后,不论是调出应用管理来清除应用还是进入设置强制结束进程,那2个辛勤的service依然坚挺着,最终小C抱走产品小姐姐走向了人生巅峰。
但其实还是有很多限制的,首先JobService要求API>21,即5.0以上的手机才可以使用,其次各手机厂商对系统的修改程度不尽相同,导致有些手机上不是那么好用也是可能的。进程保活肯定是系统想避免的,所以以后肯定会越来越难,如果不是特别有这种需求还是不要去尝试,因为得不到大厂的支持就意味着产品的不稳定。再说我们也不希望安卓手机越来越卡,这对我们用户和开发者来说都未必是好事。
最后:除了双进程守护的方式,如果大家有用过其他的更好的进程保活的方式,欢迎一起探讨!