下面说的adj定义的条件,前置条件是它已经不再持有更高优先级的条件了,比如说:HOME_APP_ADJ = 600,我们说某个应用的adj = 600,条件是指该应用是isHomeProcess()为true.那么隐含的条件就是,他不再持有更高优先级了,比如:它不再是前台了。
一、ProcessList.FOREGROUND_APP_ADJ = 0
应用处在以下状态的时候,adj = 0 :
1. //应用本身就是在前台
PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP && app == TOP_APP
或者 app == TOP_APP
2. // 正在跑 instrumentation.
app.getActiveInstrumentation() != null
3. //正在接收处理广播
mService.isReceivingBroadcastLocked(app, mTmpBroadcastQueue)
4. app.executingServices.size() > 0
final ArraySet
这个列表在bumpServiceExecutingLocked这个函数进行添加,在该函数中设置设置类服务到执行到开始时间,用来监控服务超时,在服务执行完毕到时候serviceDoneExecutingLocked被移除,也就说服务执行过程中,应用是会被拉到前台执行的
二、PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ = 50
if (app.hasForegroundServices() && adj > ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ
&& (app.lastTopTime + mConstants.TOP_TO_FGS_GRACE_DURATION > now
|| app.setProcState <= PROCESS_STATE_TOP))
应用有前台服务,且在15s内到过前台
目的:主要是为了区分刚退到后台且有前台服务到应用,和退到后台很长时间且有前台服务这俩种应用到进程优先级
三、VISIBLE_APP_ADJ = 100
应用处在以下状态的时候,adj = 100:
1. onVisibleActivity()
可以简单理解为该activity不在前台,但是确实可见的,比如该activity前面有一个非全屏的权限框
2. //跑远程动画
if (app.runningRemoteAnimation)
android/frameworks/base/services/core/java/com/android/server/wm/RemoteAnimationController.java
如:应用启动启动动画:goodToGo()-->sendRunningRemoteAnimation(true)
四、PERCEPTIBLE_APP_ADJ = 200
应用处在以下状态的时候,adj = 200, 可以基于字面意思理解
1.onPausedActivity()
2.onStoppingActivity()
3.app.hasForegroundServices()
//Is the process currently showing a non-activity UI that overlays on-top of activity UIs
4.app.hasOverlayUi()
//toast个数大于0,app.forcingToImportant一般就不会为为空。
5.app.forcingToImportant != null
五、PERCEPTIBLE_LOW_APP_ADJ = 250
1.服务的client adj < clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ,clinet bind服务到时候是以BIND_NOT_PERCEPTIBLE这种形式来bind,这个时候系统会让service到adj的优先级不低于 PERCEPTIBLE_LOW_APP_ADJ
cr.flags & Context.BIND_NOT_PERCEPTIBLE) != 0
&& clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
&& adj > ProcessList.PERCEPTIBLE_LOW_APP_ADJ)
六、BACKUP_APP_ADJ = 300
执行bindBackupAgent的应用
七、HEAVY_WEIGHT_APP_ADJ = 400
在应用启动到过程通过flag:PRIVATE_FLAG_CANT_SAVE_STATE 来判断
后台的重量级进程,在system/rootdir/init.rc文件中设置
八、SERVICE_ADJ = 500
服务启动且还在DEFAULT_MAX_SERVICE_INACTIVITY = 30*60*1000这个时间范围内
九、HOME_APP_ADJ = 600
isHomeProcess()
十、PREVIOUS_APP_ADJ = 700
wpc.isPreviousProcess() && app.hasActivities()
可以简单理解为,刚退到后台的那个应用,比如;A应用在前台,我回到桌面,这个时候A就是700
十一、SERVICE_B_ADJ = 800
app.serviceb:
1.在服务进程列表1/3之后
2.内存level大于一定阈值:
mService.mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL
&& app.lastPss >= mProcessList.getCachedRestoreThresholdKb()
十二、CACHED_APP_MAX_ADJ = 999,CACHED_APP_MIN_ADJ = 900
这一部分不涉及状态的持有,完全是以在mLruProcesses的位置来判断的,
这里可以分成俩大类:
1. Cache进程:
cache进程的adj 可能取值为: 900 910 920 930 940 950 960 970 980 990,每个adj能够对应进程个数为10
2. Empty 进程:
Empty 进程的adj值能够均匀的分布在905 915 925 935 945 955 965 975 985 995,每个adj能够对应进程个数最多为10