Android焦点之InputWindows的更新(一)

找到焦点窗口后,回到DisplayContent的updateFocusedWindowLocked方法中继续往下走 执行到此处会进行InputWindows的更新

InputMonitor#setInputFocusLw:以上过程伴随日志:WindowManager: Input focus has changed to Window{a44139a u0 NotificationShade} display=0

InputMonitor#updateInputWindowsLw:在该方法中,只有当强制更新或者mUpdateInputWindowsNeeded值为true时(在setUpdateInputWindowsNeededLw设置为true),才会进行InputWindows的更新

之后将执行scheduleUpdateInputWindows()方法,在这个方法中,会post一个Runnable对象mUpdateInputWindows,在mHandler所在的android.anim线程中执行更新流程:

接下来执行mUpdateInputForAllWindowsConsumer.updateInputWindows()方法。

mUpdateInputForAllWindowsConsumer.updateInputWindows: 在该方法中,首先会确认是否存在几类特殊的InputConsumer。InputConsumer用于读取事件,每个窗口对应的客户端都会通过InputConsumer来读取和消费事件,一般情况下,ViewRootImpl在添加窗口过程中,会在注册InputEventReceiver时自动创建InputConsumer对象。此处的特殊InputConsumer则是对一些系统UI显式地进行了创建:

然后,接mDisplayContent.forAllWindows 将发起所有WindowState的遍历,mUpdateInputForAllWindowsConsumer本身是一个Consumer接口对象,因此会回调accept()方法对每个WindowState进行处理:

以上方法中:

1.首先会对几类特殊InputConsumer进行单独处理;

  1. 然后填充InputWindowHandle对象(populateInputWindowHandle);

  2. 最后将InputWindowHandle对象设置给Transaction对象(setInputWindowInfoIfNeeded),并在事物提交后,由SurfaceFlinger设置给InputDispatcher中。

InputMonitor#populateInputWindowHandle:在该方法中,会将WindowState的部分属性填充给inputWindowHandle:

填充完毕InputWindowHandle后,调用setInputWindowInfoIfNeeded()方法,下面简单看一下InputWindowHandleWrapper这个类

java 复制代码
 //InputWindowHandle的包装类
class InputWindowHandleWrapper {
    //所有的信息都设置到 mHandle 变量中
    private final @NonNull InputWindowHandle mHandle;
    boolean isChanged() {
        return mChanged;
    }
    //......
    void setTouchableRegion(Region region) {
        if (mHandle.touchableRegion.equals(region)) {
            return;
        }
        mHandle.touchableRegion.set(region);
        mChanged = true;
    }
    void applyChangesToSurface(@NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl sc) {
        t.setInputWindowInfo(sc, mHandle);
        mChanged = false;
    }
    //......
}

@frameworks/base/core/java/android/view/InputWindowHandle.java
public final class InputWindowHandle {
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, value = {
        InputConfig.DEFAULT,
        InputConfig.NO_INPUT_CHANNEL,
        InputConfig.NOT_FOCUSABLE,
        InputConfig.NOT_TOUCHABLE,
        InputConfig.PREVENT_SPLITTING,
        InputConfig.DUPLICATE_TOUCH_TO_WALLPAPER,
        InputConfig.IS_WALLPAPER,
        InputConfig.PAUSE_DISPATCHING,
        InputConfig.TRUSTED_OVERLAY,
        InputConfig.WATCH_OUTSIDE_TOUCH,
        InputConfig.SLIPPERY,
        InputConfig.DISABLE_USER_ACTIVITY,
        InputConfig.SPY,
        InputConfig.INTERCEPTS_STYLUS,
    })        
    public InputApplicationHandle inputApplicationHandle;    
    // The window name.
    public String name;    
    public long dispatchingTimeoutMillis;
    public int frameLeft;
    public int frameTop;        
    // Window touchable region.
    public final Region touchableRegion = new Region();
    public int touchOcclusionMode = TouchOcclusionMode.BLOCK_UNTRUSTED;
}

InputMonitor#setInputWindowInfoIfNeeded:回到updateInputWindows()方法的,调用setInputWindowInfoIfNeeded将填充好的InputWindowHandle最终通过通过SurfaceFlinger设置给了InputDispatcher,

native层也有对应的surfacecontrol,刚刚封装的WindowInfo也被传递进来,后续统一apply(); BpBn调setClientStateLocked()时eInputInfoChanged更新inputInfo;

InputMonitor#updateInputFocusRequest:再回到InputMonitor#updateInputWindows中,接下先来看一下updateInputFocusRequest是如何打印"Focus request "这条log的

接着看mInputTransaction.setFocusedWindow 这个方法,后续统一apply();BpBn调addInputWindowCommands()添加命令;

再次回到InputMonitor#updateInputWindows(),调用SurfaceControl.Transaction#merge,之后,当WindowAnimator.java的animate()时发起apply();可以是线程"android.anim"或"binder"线程;

相关推荐
TeleostNaCl9 分钟前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang95271 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_915918412 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9512 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海2 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿2 小时前
毕业三年后,我离职了
android·面试
编程乐学3 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐4 小时前
Android14 init.rc中on boot阶段操作4
android
fatiaozhang95274 小时前
中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
android·xml·电脑·电视盒子·刷机固件·机顶盒刷机
Android出海6 小时前
Google Play账户与App突遭封禁?紧急应对与快速重构上架策略
android·网络·重构·新媒体运营·产品运营·内容运营