android进程保活实现方法
android进程保活实现方法。
不建议做进程保活!!!
不建议做进程保活!!!
不建议做进程保活!!!
你们在耍流氓!!!!
android在内存资源紧张的时候会杀死一些级别较低的进程来获取资源去运行别的进程。但是有时候我们不想自己的进程被杀死,所有有了进程保活的方案。但是,这毕竟违背了系统的策略的行为,可能会影响整个系统的运行。
什么是进程
引用百度词条上的解释:
进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程是一个抽象的概念,是操作系统进行资源分配和调度的基本单位,可以理解为一个程序运行最少需要一个进程。因为程序要想使用系统的资源必须要有进程。
进程保活的方法
一,延长进程存活的时间
延长进程存活的时间,一般是调高进程的优先级,或者优化代码,减少占用的系统资源。
二,进程拉活
使用一些方法使进程被杀死的时候及时的拉活
进程的优先级
一般来说进程优先级分为五级,从高到低为:
前台进程:
????某个进程持有一个正在与用户交互的activity并且该activity正处于resume的状态。????某个进程持有一个service,并且该service调用startforeground()方法使之位于前台运行
前台进程一般情况下都不多,只有在系统内存极度不够的情况下才会杀死他
可见进程:
? ? 托管不在前台、但仍对用户可见的 activity(已调用 onpause() 方法)。如:前台 activity 启动了一个对话框,允许在其后面显示上一个 activity。????托管绑定到可见(或前台)的 activity 的 service
可见进程是比较重要的进程,系统一般情况下不会杀死他
服务进程:
????通过startservice开始的服务所在的进程
服务进程也比较重要,系统只有在内存不足以维护可见进程和前台进程的时候才会杀死他
后台进程:
????一般情况是用户看不到的进程,也就是按了home或者返回到了桌面,或者在任务管理器里切换了别的应用到前台了。
这种进程重要性不高,系统会在内存不足的时候倾向于杀死他,系统会使用lru列表保存他。
空进程:
????不包含任何活跃的就属于空进程
这种进程系统随时都会杀死。
杀死进程的策略
系统杀死进程的时候也不是随便杀的。为了保证用户体验和性能,只有内存达到了一定的阈值,系统才回去杀死一些进程。杀死的策略是从优先级低的开始,比如上面的空进程最低,前台进程最高。但是同一优先级的进程那个先杀死呢?除了这个优先级外还有一个oom_adj的值来标记每个进程,并且结合进程所使用的资源。oom_adj的值越小,进程越重要,越晚被杀死。同时也会参考进程所使用的资源大小。
进程保活之延长进程存活时间
延长进程存活时间是针对系统杀死进程的策略来做的。既然进程优先级最高的最后被杀死,那么我们可不可以强行提高进程的优先级了?
一 service使用startforeground
在启动服务的时候条用startforeground()方法,参数是一个notification和notification的id。但是通知栏会显示通知,所以我们构建一个空的通知就好了。但是google在4.3之后不让显示空通知了,哪只能使用别的方式了。使用俩个服务,启动一个服务,然后服务里面startforeground,传一个notification,记一下他的id。在启动另一服务,通过系统的通知服务和id获取到这个通知,然后取消掉。这个时候,通知还没有显示出来,但是第一个服务优先级已经被提升到了前台进程了。但是需要注意,有些rom下会亮一下屏幕。
二 和系统service捆绑
系统的服务更难被杀死,所以我们可以将进程与系统的服务捆绑,达到延长自己进程存活时间的目的。比如说使用notificationlistenerservice。我们自己写个基础自其的服务。在这个服务所属进程中在启动一个服务,这个服务去拉自己的主进程。但是需要注意的是,这种情况一般需要申请权限。
三 开启一个像素的activity
当我们监控到我们应用被切换到后台时,开启一个像素的acitivity在界面上,用户看不见,但是我们的应用处于可见进程级别。或者有些安全软件为了达到省点的目的,在锁屏后一定时间后,会杀死后台进程。哪我们就要监控锁屏广播,在锁屏的时候开启一个像素的activity,然后解锁后销毁他,达到在锁屏状态时提升进程级别,避免被这些软件杀死。
进程保活之拉活
一 开启俩个服务互相拉活
这种比较简单,俩个进程各开个分服务,轮询对方状态。发现对方被杀死了,就进行拉活操作。不过要尽量使其中一个进程占用资源比较少,避免被一起杀死,不过一些深度定制rom可能不行,比如某米,某族,某为。
二 监听系统全局广播进行拉活
静态注册一些全局广播,监听系统一些比较频繁的广播。然后在广播接受者中判断进程状态,如果被杀掉了就进行拉活。但是在3.1之后系统加了限制。要求必须是安装后启动过一次的应用才能监听。他会给每个应用设置一个stopped状态,安装了未使用的应用就处于这个状态,全局广播是不会传递到这种状态下的应用中的。只要你的应用被用户使用过一次就可以避免这个状态了,只有重装了才会被重置回stopped状态。但是,某些深度定制的rom会修改这个状态的重置策略。他们会将用户结束进程的应用重新设置上这个状态。
三 全家桶系列
如果使用了第三方推送服务的话,就自动使用这种拉活方法。就是说如果别的应用和你们的应用使用了同一家推送服务,并且你们的应用的进程被杀死了,但是对方的应用还存活。那么你们的应用也能接收到对应的推动服务。我本人是比较推荐这种方式的。
总结
以上所说的方法,在最新的android版本和一些深度定制的rom里面可能都不行了,除了全家桶系列的吧。最后还是劝一句,做啥进程保活了,直接解决掉提出这个问题的人吧。
上一篇: Object-C---)Swift之(十)存储属性
下一篇: ASP代码获取网页源代码