搜了很多资料,大概有四种方法能实现service不被回收。
1.把service写成系统服务,将不会被回收。这个不靠谱,设置后没效果,据说必须是系统应用才行,也就是要设置ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT,不知道怎么设置,有大神知道的麻烦告知。
2.提高service的优先级(未实践),设置android:priority="1000",还没有试过,不知道效果如何。
3.将服务写成前台服务foreground service(已实践,很大程度上能解决问题,但不能保证一定不会被杀)。这个方法比较靠谱。但是有个缺陷,出现的notification会一直显示在消息通知栏中,有强迫症的同学伤不起···
4.利用ANDROID的系统广播检查Service的运行状态,如果被杀掉,就再起来。
利用的系统广播是Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。但是有个问题,如果注册的是动态广播,这个广播的监听事件会随着context的销毁一起消失,不可行。如果是静态注册,可是Intent.ACTION_TIME_TICK这个广播又不支持静态注册。看来只能换一个系统广播来静态注册监听,目前还没想到能监听的系统广播,求大神告知。
总结:目前最好的方案据说是类似于微信,启动两个进程互相监视,如果有一个被关闭,另外一个马上启动之。这个方案还没试过,不知道具体怎么操作。第二选择方案就是上面提到的3,写成foreground service。