通过在MainActivity中拦截Back键来实现进程保活功能
2017-03-21 23:08
399 查看
今天在分析解决一个问题时,通过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,可以在一定程度上实现进程保活的功能 。
后来,通过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,可以在一定程度上实现进程保活的功能 。
相关文章推荐
- 启动FFmpeg.exe进程完成通过命令行可以实现的功能
- 在进程间,通过socket()进行通信,实现聊天功能
- 如何通过程序实现网卡的启用和禁止功能?
- 通过Socket实现进程间异步通讯(二)
- 通过Socket实现进程间异步通讯(三)
- 通过Socket实现进程间异步通讯(四)
- 用 JavaScript 实现"back"按钮的功能
- 通过Socket实现进程间异步通讯(三)
- API 通过HOOK OpenProcess() 实现进程防杀
- [原创]通过点击节点或选择节点前checkbox实现树节点单选功能!
- 通过Socket实现进程间异步通讯(四)
- 两个或多个进程之间通过Win32 API实现内存共享的方法(转)
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 通过二次开发在SAP R/3中实现库存日清功能
- 两个或多个进程之间通过Win32 API实现内存共享的方法(转)
- [新功能]初步实现通过二级域名访问自己的Blog
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能 activeandbadboy [原作]
- 通过spring的拦截器实现Filter的功能
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 完全用 VB 6.0 自身功能实现对 Windows 消息的拦截!