课程名称: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 平台的流畅性。