今天在分析解决一个问题时,通过Log发现第三方应用脉脉在按Back键“退出”应用时,竟然会调用Launcher。当时看到后感到很奇怪,因为我们平时写应用时,根本就不会在应用中去写调用Launcher的代码,应用若想回到 Launcher,只需要直接按Home键及连续按Back键就可以了。难道这是脉脉的多此一举吗?
后来,通过adb shell dumpsys activity a 命令将Activity栈打印出来时,终于想明白了脉脉应用的意图。我们知道Android系统在内存不足的时候会根据进程的侁先级来Kill掉一些进程,这个优先级的依据就是OOM_ADJ。根据应用所处的状态不同,系统会分给它不同的OOM_ADJ,其中OOM_ADJ的值越小,表示进程的优先级越高,越不容易被杀,具体在源码的 http://androidxref.com/7.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/am/ProcessList.java 文件中进行了声明。我们知道进程的状态大致可以分为以下五类:前台、可见、Service、后台、空进程,它们的优先级是依次减小的。知道些以后,也就不难想明白脉脉应用为什么要在应用“退出”时调用Launcher的意图了。若我们平时不在自己应用的MainActivity中拦截Back键,并在响应函数中调用Launcher,那么我们的应用在回到 MainActivity后,再点击Back键时,就会因为Activity的销毁而变成一个空进程。而如果我们能够在MainActivity中拦截Back键,并在响应函数中调用Launcher,那么我们应用的MainActivity并不会销毁,而只是退到了后台。这样,我们的应用也至少是一个后台进程,进程的优先级也至少要高于空进程,所以不会那么容易被杀。所以,通过在MainActivity中拦截Back键,并在响应函数中调用Launcher,可以在一定程度上实现进程保活的功能 。