参考:http://www.jianshu.com/p/63aafe3c12af#
现在APP有这样一个需求:当APP缩后台后,转去使用其他APP,再回来的时候APP是重新启动!现在要做的是尽量避免这个事情!
What
问题出现于现有App内有一个开屏页,也就是每次进入都会有的那个闪屏页。那么就有两个思路,一个是把开屏页去掉!一个是提升APP的存活时间,也就是使APP的回收级别提高!
How
提升APP存活时间大致有三种方法:1、黑色保活,2、白色保活,3、灰色保活:
黑色保活:利用不同的APP之间进行广播唤醒,可以使第三方APP也可以是系统的APP
白色保活:启动前台Service
灰色保活:利用系统的漏洞启动前台Service
黑色保活
1、开机、网络切换、拍照、拍视频的广播唤醒app,但是从Android N取消了拍照、拍视频、网络切换等广播。而开机广播再有的第三方rom也去掉了。
2、接入SDK唤醒app。比如你介入了微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。或者有的推送sdk也会唤醒app。
3、其他app唤起同家公司app。比如,腾讯系app唤醒腾讯系其他产品。
白色保活
启动前台的Service进程。也就是说在保活的进程中启动一个Service,然后Service中启动一个通知Noification,比如QQ音乐,360通知栏等等。
灰色保活
也是启动一个前台的Service进程,但是与普通的启动方式区别在于,通知栏不会出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样的话就使得自身进程优先级高于普通后台进程的。
具体可参考原文:http://www.jianshu.com/p/63aafe3c12af#
再者说为什么QQ进程不死,我也曾认为存在这样一种技术。可惜我把手机root后,杀掉QQ进程之后就再也起不来了。有些手机厂商把这些知名的app放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通app一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。
Why
首先进程回收是有个优先级的,优先级从高到低是:
- 前台进程(Foreground Process)
- 可视进程(Visible Process)
- 服务进程(Service Process)
- 后台进程(Background Process)
- 空进程(Empty Process)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM Killer(Out-Of-Memory killer)机制诞生。
其他方法的一些参考
https://www.zhihu.com/question/29826231
把你的应用做到QQ那么大,那么有用户需求,不需要流氓,所有的工具软件都会把它加入白名单。
1、Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
2、通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill(本文类似方法)
3、双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
4、QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
5、在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)
6、Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行听说耗电量增加):①用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。②在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。③主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
7、联系厂商,加入白名单