继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第18天 Android 进程保活面试问题

GT9456
关注TA
已关注
手记 89
粉丝 12
获赞 17

课程名称BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师DocMike

课程内容

进程的优先级

Android 进程的优先级按照从高到低的顺序依次是:前台进程、可见进程、服务进程、缓存进程、空进程。如果系统资源不足,为了能够创建新的进程,系统会杀死一些低优先级进程,并回收该进程所占用的内存。系统回收内存是按照从优先级从低到高的顺序。

1. 前台进程(Froeground Process)

Android 中的前台进程包括:

  • 正在交互的 Activity 所在的进程;
  • 绑定在正在交互的 Activity 的 Service 进程;
  • 在前台运行的 Service 所在的进程,Android 可以让服务使用 startForeground() 方法成为高优先级前台服务。
  • 处理生命周期回调 onCreate(), onStartCommand() 和 onDestroy()的 Service 进程;
  • 处理 OnReceive() 回调的 BroadcaseReceiver 进程。

2.可见进程(Visible Process)

如弹出对话框,对话框是前台进程,后面被覆盖的 Activity 就变成了可见进程。绑定在可见 Activity 组件上的 Service 进程,也被称为可见进程。

3. 服务进程(Service Process)

调用 startService() 方法启动的 Service 进程组件,就是服务进程。服务进程可以处理一些操作:如后台下载,数据传输等,除非内存不足,无法维持可见进程与前台进程,一般不会被回收。

4. 后台进程(Background Process)

调用了 onStop() 方法的 Activity,比如点击 Home 键,任务栈进入后台;点击 Menu 键,切换了其它任务栈。

5. 空进程(Empty Process)

在任何层次中,空进程都是最低优先级的。如果不属于以上类别,那它就是这种。

Android 进程的回收策略

通过 OOM_ODJ(判断进程的优先级)评分机制,对进程进行打分,然后将分数高的进程判定为 bad 进程,杀死并释放内存。

进程保活方案

1.利用系统广播拉活

在触发系统事件的时候,会发出相应的广播,我们可以在Manifest中静态注册广播接受者来监听这个广播,(例如开机、网络变化)来实现拉活,但容易被管理类软件禁用导致失效。

2.利用系统Service机制拉活

在 Service 中有个 onStartCommand() 回调方法,将其返回值设置成 START_STICKY,当 Service 因为系统内存不足被杀掉后,在未来某个时间内,当系统内存充足时会尝试重建这个 Service,然后重新回调 onStartCommand()方法。第一次拉活在5秒内,第二次在10秒内,第三次在20秒内,短时间内多次被杀死后不会进行拉活。

3.利用Native进程拉活

利用 Linux 系统中 Fork 机制创建一个 Native 进程,在 Native 进程中监控主进程,一旦主进程挂掉及时重建。Android 5.0 之后系统对 Native 进程加强了管理,所以Native 拉活的方案是失效的。

4.利用JobScheduler机制拉活

Android 5.0 后新提供的一种方案,JobScheduler 允许在特定状态与特定时间间隔周期执行任务。可以利用它的这个特点完成保活的功能,效果即开启一个定时器,与普通定时器不同的是其调度由系统完成。

5.利用账号同步机制拉活

不同的 app 进程,用广播相互唤醒,包括利用系统提供的广播进行唤醒。

课程收获

这一章介绍实现 Android 进程保活的一些手段。坦白的讲,作为 Android 开发者真心不希望有这种黑科技存在的,它只会滋生更多的流氓应用,拖垮 Android 平台的流畅性。
图片描述
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP