Android进程优先级ADJ算法
2018-07-10 本文已影响42人
蒸汽飞船
当Android四大组件状态改变时会updateOomAdjLocked()
来同步更新相应进程的ADJ优先级。这里需要说明一下,当同一个进程有多个决定其优先级的组件状态时,取优先级最高的ADJ作为最终的ADJ。另外,进程会通过设置maxAdj来限定ADJ的上限。
FOREGROUND_APP_ADJ(0)
场景1:满足以下任一条件的进程都属于FOREGROUND_APP_ADJ(0)优先级:
1.正处于resumed状态的Activity
2.正执行一个生命周期回调的Service(比如执行onCreate,
3.onStartCommand, onDestroy等)
4.正执行onReceive()的广播接收者
5.通过startInstrumentation()启动的进程
场景2: 当客户端进程activity里面调用bindService()方法时flags带有BIND_ADJUST_WITH_ACTIVITY参数,并且该activity处于可见状态,则当前服务进程也属于前台进程。
VISIBLE_APP_ADJ(100)
可见进程:当ActivityRecord的visible=true,也就是Activity可见的进程。
PERCEPTIBLE_APP_ADJ(200)
可感知进程:当该进程存在不可见的Activity,但Activity正处于PAUSING、PAUSED、STOPPING状态,则为PERCEPTIBLE_APP_ADJ
满足以下任一条件的进程也属于可感知进程:
- foregroundServices非空:前台服务进程,执行startForegroundService()方法
- app.forcingToImportant非空:执行setProcessImportant()方法,比如Toast弹出过程。
- hasOverlayUi非空:非activity的UI位于屏幕最顶层,比如显示类型TYPE_APPLICATION_OVERLAY的窗口。
SERVICE_ADJ(500)
服务进程:没有启动过Activity,并且30分钟之内活跃过的服务进程。 startRequested为true,则代表执行startService()且没有stop的进程。