1、
让进程在系统中永远存在,怎么杀都杀不死,就算杀死了,仍然有办法让它保活起来。这不是流氓手段,因为很多情况下要为用户提供服务,需要有一个进程常驻着,以便在特定的时候做些特定的事情。频繁接收的广播只能动态注册,比如Android的锁屏广播接收者,这时如果没有常驻的进程,就无法接收到常驻的广播。还有一些push、定位服务等,也需要在后台维护一个长的连接,以便在最及时的时间内将信息传达给用户。比如推送信息给用户、定位用户地理位置,都需要进程保活。进程保活在内存,或多或少都会进行性能消耗。
进程被杀死的原因,一方面是人为地调用了kill方法,第二个,可能被第三方的应用杀死
2、
前台进程、可见进程、服务进程,系统一般不会回收,background process和empty process 系统可以在内存不够的时候随时进行回收。
3、
4、
①系统广播拉活:利用常用系统广播如开关机、网络数据变化、sd卡的卸载等在mainfest注册广播接收器。但是这个方法有明显的缺陷,广播接收者被管理软件或系统软件通过自启动管理禁用的场景下,它是无法接收到广播的。从而无法进行自启动,无法进行系统拉活。第二个就是系统广播事件是不可控制的,只有在发生事件的时候才能拉活,但是无法保证,进程立即被杀死,就能够被立即拉活。
②利用系统Service机制拉活,在service中有一个onstartcommand方法,将返回值置为start_sticky,这样就可以利用系统机制,当service挂掉之后自动拉活。返回值的意思是当系统由于内存不足service被杀掉之后,系统会尝试创建该service,一旦创建成功之后,又会回调onStartCommand方法。只有当内存不足被杀掉后才会被拉活。service在第一次杀死后会在5s内被重启,第二次被杀死后会在10s内被重启,第三次绘制20s内重启,如果在短时间内service被kill掉的次数超过了三次以上,这个服务就不会被拉活。了。第二个就是如果被获取root权限的系统工具强制stop,这样通过service机制也是无法重启进程的。
③利用native进程拉活:利用linux中的fork机制,创建一个native进程,在native进程中可以监主进程的存活,当主进程挂掉之后,由于native进程监控着主进程,native进程就可以立即对主进程进行拉活。主要原理也是利用的Android里的ams来管理,Android 5.0之后对native进程进行了管理,native进程拉活是失效的。可以在native进程中添加一个定时器,轮询监听主进程是否存活,这是一个比较耗时比较浪费资源的操作,第二,可以在主进程中创建一个监控文件,并且在主进程中持有文件的锁,在拉活进程启动后,申请文件锁就会被阻塞,一旦可以成功申请到锁,说明主进程挂掉了,这时候就可以通过native进程进行拉活。
如何在native进程中拉活主进程?
主要通过一个am命令就可以进行拉活
④利用JobScheduler机制拉活
⑤利用账号同步机制拉活