进程优先级
bindService或者startService是否前台调用取决于caller进程的调度组。当caller属于SCHED_GROUP_BACKGROUND则认为是后台调用,当不属于SCHED_GROUP_BACKGROUND则认为是前台调用。callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
- 关于CPU调度组
调度级别 | 缩写 | 进程组 | 备注 |
---|---|---|---|
SCHED_GROUP_BACKGROUND(0) | B | THREAD_GROUP_BG_NONINTERACTIVE | 后台进程组 |
SCHED_GROUP_DEFAULT(1) | F | THREAD_GROUP_DEFAULT | 前台进程组 |
SCHED_GROUP_TOP_APP(2) | T | THREAD_GROUP_TOP_APP | TOP进程组 |
SCHED_GROUP_TOP_APP_BOUND(3) | T | THREAD_GROUP_TOP_APP | TOP进程组 |
- SCHED_GROUP_TOP_APP:
- setRenderThread()过程,根据属性sys.use_fifo_ui来决定采用SCHED_FIFO,或者设置当前线程的优先级为-10
- TOP_APP或者app.hasTopUi,则设置为该值
- SCHED_GROUP_TOP_APP_BOUND:
对于ConnectionRecord带有BIND_ADJUST_WITH_ACTIVITY和BIND_IMPORTANT,并且没带有BIND_NOT_FOREGROUND的情况下, 当客户端进程的有可见的Activity,或者处于RESUMED/PAUSING状态时,则设置为该值
- SCHED_GROUP_BACKGROUND:
- 应用已结束(app.thread == null)
- 正在接收来自于mBgBroadcastQueue广播队列的广播;
- 正在执行来自于前台调度进程发起的服务(execServicesFg=false)
- TOP_APP,且设备处于睡眠状态
等等
- SCHED_GROUP_DEFAULT:
- 默认值
- ADJ <= FOREGROUND_APP_ADJ;
- 正在接收来自于mFgBroadcastQueue广播队列的广播;
- 正在执行来自于前台调度进程发起的服务(execServicesFg=true)
- Activity处于可见状态(visible=true)
- 具有fg-service或者设置forcingToImportant的服务
- 正在显示一个ove