当前位置:   article > 正文

Android中进程保活相关面试问题_android进程管理机制 面试

android进程管理机制 面试

1.Android的进程优先级

  • Foreground process 前台进程,即用户当前操作所在的进程。通常在任意给定的时间内,前台进程是数量不多的。只有在内存不足以支持它们同时继续运行的情况下,系统会杀掉它们。前台进程有正在和用户交互的Activity,还有在前台运行的Service,以及广播接收者中的onReceive回调方法里边,也是属于前台进程。
  • Visible process 可见进程,它表示的是没有任何前台组件,但是它仍会影响用户在屏幕上所见内容的进程。除非为了维持前台进程的运行,内存不足时会回收可见进程,否则系统是不会去回收可见进程的。
  • Service process 服务进程,它与用户所见内容没有直接关联。但是它们通常在执行一些用户关心的操作。比如在后台从网络获取数据,后台播放音乐,后台进行数据计算等等。因此也只有在内存不足以维持前台进程和可见进程的情况下,系统才会回收服务进程。其它情况下Service Process都会保持运行状态。
  • Background process 后台进程,它对用户体验没有直接影响。用户可以随时终止它们,用来回收内存。这部分回收的内存用来供给前面三个进程使用。在后台进程中运行的程序,它们保存在一个列表中,用来确定用户最后一个查看的进程最后一个终止。它是一个LRU的算法。
  • Empty process 空进程,保留这个进程唯一的目的就是用来做缓存,以缩短下次运行组件所需的启动时间。为了使总体的系统资源在进程缓存和内存底层之间保持平衡,系统往往会终止Empty Process。
  • 其中前台进程、可见进程和服务进程,在系统内存足够的情况下,系统是不会回收它们三个进程的。只有在内存不足的时候才会回收它们。而后台进程和空进程系统就会比较随意地去回收它们进程,而用来给前面三个优先级进程提供内存。

2.Android进程的回收策略

Low memory killer是基于Linux的Out of Memory机制改过来的。我们知道,Out of Memory是一个比较复杂的评分机制。它会对进程的优先级进行打分,将分数高的进程视为bad进程,然后杀死它,并释放内存。而Low memory killer和OOM不一样的地方是,OOM这个机制只有当系统内存不足的时候才会启动检查,而Low memory killer这个机制是定时进行检查的。在这里,Low memory killer它主要通过进程的OOM_ODJ这个阈值来进行判断,而这个OOM_ODJ阈值它是用来判断进程优先级的。当OOM_ODJ越小,进程的优先级越高,Lower Memory killer就越不会去回收它。当OOM_ODJ这个阈值越大,说明这个进程优先级越低,而Lower Memory killer这个机制就会回收这部分进程。

3.进程保活方案

  • 利用系统广播拉活:在发生系统事件时,系统会发出相对响应的广播,我们可以在AndroidManifest中静态注册这个广播监听器。常用广播事件有开机、网络变化、SD卡卸载等。但是要注意,利用系统广播拉活这个方法,它是有明显缺陷的。首先第一点,广播接收者被管理软件或系统软件通过自启动管理等功能禁用的场景下,它是无法接收广播的,从而它就无法进行自启动,进行系统拉活。第二个就是系统广播事件其实是不可控制的。只有在发生事件的时候才能进行拉活。但它无法保证进程立即被杀死,它就立即能拉活。所以这是广播拉活的缺点。
  • 利用系统Service机制拉活

    回顾一下,在Service当中,有个onStartCommand回调方法,在这个方法中如果你把它的返回值设置成为START_STICKY,这样就可以利用系统机制,在Service挂掉后自动拉活。

    回顾一下Service的START_STICKY这个返回值,它表明,当Service因为内存不足被系统杀掉之后,接下来在未来的某个时间段内,当系统内存足够用的情况下,系统会尝试创建这个Service。一旦创建成功之后,它又会回调Service的onStartCommand方法。

    这里注意是在因为内存不足被系统杀掉之后,并不是所有被杀掉的情况,所以Service拉活也是有缺点的。有两种情况无法拉活,第一种就是Service第一次被异常杀死后,会在5秒内重启,第二次杀死后会在10秒内重启,第三次它会在20秒内重启。一旦在短时间内Service被kill的次数超过三次以上,这个系统将不进行拉活。第二种就是进程它被取得root权限的管理工具或者系统工具通过强制stop停止掉的时候,这样通过Service拉活无法重启进程。
  • 利用Native进程拉活

    这种方法的主要思想是,利用Linux当中的fork机制,创建一个Native进程。而在Native进程当中,你可以监控主进程的存活。当主进程一旦挂掉之后,由于Native进程监控的主进程,这时候Native进程就可以立即对主进程进行拉活。其实它用的原理主要是Android中的AMS,即Activity Manage Service,但Android 5.0之后系统对Natvie进程进行了加强管理,所以Native拉活方式是失效的。
  • 利用JobScheduler机制拉活

    Android 5.0之后提供该接口,这个接口也是会监听主进程的存活,然后调用拉活进程。
  • 利用账号同步机制拉活

    Android系统的账号同步机制它会定期同步账号信息,这个方案主要利用同步机制进行进程拉活,不过最新的Android版本对账户同步做了改动,这个方法可能也不再生效了。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/633743
推荐阅读
相关标签
  

闽ICP备14008679号