一开始以为对应的type类型的int值就是最终的层级,试了半天都不对。就去看了下源码(Android11),发现是我错了, 此处记录下这个问题
-
根据源码一步一步观察调用链,很容易发现
WindowManager
中的addView
是通过Session
(也是就IWindowSession
的实现类)中的addToDisplay
方法, 进一步追踪发现是WindowManagerService
中的addWindow()
方法调用,通过一系列判断最终调用win.mToken.addWindow(win);
不同源码可能不一样。 -
继续追踪代码,最后来到
WindowToken
中的mWindowComparator
发现是一个实现了Comparator的变量,点击发现是通过mBaseLayer比较的。 -
继续返回WindowState类,查看mBaseLayer赋值的地方。因为我只要看系统层级的。计算公式
mPolicy.getWindowLayerLw(this) * TYPE_LAYER_MULTIPLIER + TYPE_LAYER_OFFSET;
也就是只要看WindowManagerPolicy::getWindowLayerLw
是怎么实现的即可
另外注意下(PhoneWindowManager extends WindowManagerPoilcy)::checkAddPermission
和 DisplayPolicy::prepareAddWindowLw
筛选的type类型