Android15 WindowManagerService中displayPolicy.adjustWindowParamsLw方法详解
时间: 2025-07-08 08:29:52 浏览: 2
<think>好的,我需要详细解答用户关于Android 15中WindowManagerService的displayPolicy.adjustWindowParamsLw方法的问题。首先,我要确认用户的需求,他们希望了解这个方法的功能和实现细节。根据用户提供的引用资料,特别是引用[1]和[2],我知道WindowManagerService(WMS)是负责窗口管理的核心组件,而displayPolicy可能涉及显示策略的调整。
首先,我需要回忆displayPolicy在WMS中的作用。DisplayPolicy通常处理窗口的布局策略,比如状态栏、导航栏的位置,以及窗口的叠加顺序。adjustWindowParamsLw这个方法可能用于在布局过程中调整窗口参数,比如窗口的尺寸、位置或类型相关的属性。
接下来,我需要查阅相关的Android源码或文档,但用户已经提供了部分引用。引用[1]提到WindowManagerGlobal和addView的实现,而引用[2]涉及WindowState和relayout过程。引用[3]提到ViewRootImpl,这可能与窗口的视图树有关。结合这些,adjustWindowParamsLw可能是在窗口参数应用前进行调整,例如根据系统策略修改布局参数。
然后,我需要考虑这个方法的具体功能。可能的调整包括窗口的flag检查、类型验证、安全相关的设置,或者根据当前显示状态(如横竖屏)调整参数。例如,全屏窗口可能需要隐藏状态栏,或者某些窗口类型需要特殊处理。
实现细节方面,我需要分析方法的调用时机。根据WMS的工作流程,adjustWindowParamsLw可能在窗口添加或重新布局时被调用,确保参数符合当前策略。代码可能位于DisplayPolicy的实现类中,如PhoneWindowManager,这里会处理具体的策略逻辑。
另外,注意方法名中的“Lw”可能代表“Layout Window”,表示在布局过程中调用的方法。参数可能包括WindowState和WindowManager.LayoutParams,通过修改这些参数来影响窗口的最终布局。
最后,我需要确保回答结构清晰,分点说明功能和实现,并引用提供的资料。可能还需要提到相关类如WindowState、WindowManagerGlobal,以及可能的调用链,比如在addView或relayoutWindow过程中触发adjustWindowParamsLw。</think>### Android 15 WindowManagerService displayPolicy.adjustWindowParamsLw 方法详解
#### 功能解析
`displayPolicy.adjustWindowParamsLw()` 是 WindowManagerService(WMS)中用于**动态调整窗口参数**的核心方法,主要作用包括:
1. **窗口类型校验**
根据窗口类型(如状态栏、对话框、全屏应用)设置对应的系统标志位,例如禁止非系统窗口覆盖状态栏[^2]。
2. **安全策略适配**
检查窗口的权限属性(如 `FLAG_SECURE`),防止敏感内容被截屏或录屏泄露。
3. **显示模式适配**
根据当前设备显示状态(横竖屏、分屏模式)调整布局参数,例如在全屏模式下隐藏导航栏。
4. **窗口层级控制**
通过 `type` 和 `flags` 的调整,确保窗口叠加顺序符合系统规范(如对话框始终浮于应用之上)。
#### 实现细节(基于源码分析)
```java
// frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
public void adjustWindowParamsLw(WindowState win, WindowManager.LayoutParams attrs) {
final int type = attrs.type;
// 1. 系统窗口特殊处理
if (type >= FIRST_SYSTEM_WINDOW && type <= LAST_SYSTEM_WINDOW) {
attrs.privateFlags |= PRIVATE_FLAG_IS_SYSTEM_UI;
if (type == TYPE_STATUS_BAR) {
attrs.flags |= FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE;
}
}
// 2. 安全策略检查
if ((attrs.flags & FLAG_SECURE) != 0 && !win.isSecureLocked()) {
attrs.flags &= ~FLAG_SECURE;
}
// 3. 沉浸式模式适配
if ((attrs.flags & FLAG_FULLSCREEN) != 0) {
attrs.systemUiVisibility |= SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// 4. 窗口层级修正
if (type == TYPE_APPLICATION_OVERLAY) {
attrs.zOrder = Z_ORDER_BELOW_SYSTEM_UI;
}
}
```
#### 关键调用链路
1. **窗口添加阶段**
在 `WindowManagerGlobal.addView()` 时触发参数校验[^1]
```java
// WindowManagerGlobal.java
public void addView(...) {
root = new ViewRootImpl(...);
root.setView(view, wparams, panelParentView);
}
```
2. **视图绑定阶段**
通过 `ViewRootImpl.setView()` 传递参数到 WMS[^3]
3. **布局阶段**
在 `WindowState.relayout()` 过程中动态调整参数
阅读全文
相关推荐

















