Android R WindowManagerService模块(5) 焦点窗口和InputWindows的更新

本文详细介绍了Android R中焦点窗口的更新过程,从`DisplayContent#updateFocusedWindowLocked()`方法开始,分析了如何寻找和更新焦点窗口,以及如何处理InputWindows的更新。在焦点窗口变化时,系统会更新IME目标窗口,调整窗口层级,并通知WMS。同时,`InputMonitor`负责同步新的焦点窗口并更新所有InputWindows。
摘要由CSDN通过智能技术生成

1.3.DisplayContent#updateFocusedWindowLocked()

该方法如下:

// frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java

boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows,
int topFocusedDisplayId) {
// 寻找焦点窗口
WindowState newFocus = findFocusedWindowIfNeeded(topFocusedDisplayId);
// 焦点窗口没有变化时,返回false
if (mCurrentFocus == newFocus) {
return false;
}
boolean imWindowChanged = false;
final WindowState imWindow = mInputMethodWindow;
// 更新IME target窗口
if (imWindow != null) {
// 记录当前IME Target窗口
final WindowState prevTarget = mInputMethodTarget;
// 获取新的IME Target窗口
final WindowState newTarget = computeImeTarget(true /* updateImeTarget*/);
// IME Target窗口是否发生变化
imWindowChanged = prevTarget != newTarget;
// 进行window layer的分配
if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS
&& mode != UPDATE_FOCUS_WILL_PLACE_SURFACES) {
assignWindowLayers(false /* setLayoutNeeded */);
}
}
// IME target窗口发生变化,重新获取一次焦点窗口
if (imWindowChanged) {
mWmService.mWindowsChanged = true;
setLayoutNeeded();
newFocus = findFocusedWindowIfNeeded(topFocusedDisplayId);
}
// 通知WMS焦点窗口发生变化
if (mCurrentFocus != newFocus) {
mWmService.mH.obtainMessage(REPORT_FOCUS_CHANGE, this).sendToTarget();
}
// 记录旧焦点窗口
final WindowState oldFocus = mCurrentFocus;
// 更新新焦点窗口
mCurrentFocus = newFocus;
// 从mLosingFocus移除
mLosingFocus.remove(newFocus);

if (newFocus != null) {
// 这俩列表用于记录ANR状态,表示自从焦点窗口为空时添加和移除的窗口
mWinAddedSinceNullFocus.clear();
mWinRemovedSinceNullFocus.clear();
// 设置焦点窗口所在mToken.paused属性为false
if (newFocus.canReceiveKeys()) {
newFocus.mToken.paused = false;
}
}
// 用于通知Task更新shadow radius
onWindowFocusChanged(oldFocus, newFocus);
// 通知DisplayPolicy焦点窗口发生变化,并接受返回结果
int focusChanged = getDisplayPolicy().focusChangedLw(oldFocus, newFocus);
// IME target窗口发生变化,且旧焦点窗口非输入法窗口时
if (imWindowChanged && oldFocus != mInputMethodWindow) {
// 根据mode, 进行layout或assign window layer操作
if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
performLayout(true /initial/, updateInputWindows);
focusChanged &= ~FINISH_LAYOUT_REDO_LAYOUT;
} else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
assignWindowLayers(false /* setLayoutNeeded */);
}
}
// DislayPolicy返回结果
if ((focusChanged & FINISH_LAYOUT_REDO_LAYOUT) != 0) {
setLayoutNeeded();
if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
performLayout(true /initial/, updateInputWindows);
} else if (m

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值