当窗口信息变化时,就应该把变化后的窗口信息传递给InputDispatcher,所以,从“什么时候会改变窗口信息入手”,这些变化的可能有:

(1) 窗口大小发生变化时;

(2) 窗口从显示变为隐藏,或隐藏变为显示时;

(3) 暂停或恢复对消息的处理时;

(4) 窗口层值发生变化时;

(5) 添加或删除窗口时;

这当然只是其中一部分,根据这个思路,在WindowManagerService中寻找对应的方法,柯先生总结有以下方法:

调用updateInputWindowsLw的方法 描述
removeWindowInnerLocked() 删除窗口
relayoutWindow() 重新对窗口进行排级
removeWindowToken() 删除窗口
setTokenVisibilityLocked() 改变窗口的显示状态
InputMonitor.setInputFocusLw() 设置某个窗口为消息输入的对象窗口
InputMonitor.pauseDispatchingLw() 暂停指定窗口接收用户消息
InputMonitor.resumeDispatchingLw() 恢复指定窗口继续接收用户消息
performLayoutLockedInner() 对窗口重新进行排版

在addWindow分析中说过,添加窗口是调用了performLayoutLockedInner方法实现将信息传递给InputDispatcher的。

接下来继续分析信息是如何写入InputDispatcher的。

不难发现,上述方法的共性是都调用了InputMonitor的updateInputWindowLw(),我们主要关注该方法中的以下代码:

mInputManager.setInputWindows(mTempInputWindows.toNullTerminatedArray());

跟进去,在InputManager中又调用了com_android_server_InputManager.cpp的本地方法:

public void setInputWindows(InputWindow[] windows) {nativeSetInputWindows(windows);
}

nativeSetInputWindows方法代码如下所示:

void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowObjArray) {Vector<InputWindow> windows;jsize length = env->GetArrayLength(windowObjArray);for (jsize i = 0; i < length; i++) {jobject inputTargetObj = env->GetObjectArrayElement(windowObjArray, i);if (! inputTargetObj) {break; // found null element indicating end of used portion of the array}windows.push();InputWindow& window = windows.editTop();bool valid = populateWindow(env, inputTargetObj, window);if (! valid) {windows.pop();}env->DeleteLocalRef(inputTargetObj);}mInputManager->getDispatcher()->setInputWindows(windows);
}

最后的getDispatcher()->setInputWindows顺利把窗口信息传递给了InputDispatcher。

Android入门之把窗口信息传递给InputDispatcher相关推荐

  1. 怎么将hashmap的数据传递给js_将Excel数据信息传递给Powerpoint应用

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十六个专题"将Excel信息传递给Powerpoint及文本文件"的第一节"将Excel数据信息传 ...

  2. android中的add方法,Android入门之addWindow

    前面说到,应用程序添加窗口时,会在本地创建一个ViewRoot,然后通过IPC(进程间通信)调用WmS的Session的addWindow请求WmS创建窗口,下面来看看addWindow方法. add ...

  3. Android 百度地图获取定位信息并实时传给后台

    最近公司提了一个小case,因为公司物流师傅配送完货物后,通常回仓库都是空车,而这是严重的资源浪费,所以领导就给了一个小case,实时定位司机路线,先建立司机行车档案,在考虑其他业务,反正也是比较空, ...

  4. [转]Android入门基础教程

    第1章 Android Studio运行第一个程序 1.1 Android Studio下载: 1.1.1 Android开发者官网: Android 开发者  |  Android Develope ...

  5. Android入门知识全套笔记

    安装apk: 开发完成之后,需要buildAPK,再次发送才能运行. adb install -r (apk完整路径) 安装在第三方app 系统级app需要把打包好的apk,浦西 卸载apk:adb ...

  6. Android入门文档

    该文章为网络材料整理,部分内容经过重新编写. 一. 名词介绍 JDK:Java Development Kit Java 语言的软件开发工具包 JRE:Java Runtime Environment ...

  7. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

  8. Android入门(九)| 滚动控件 ListView 与 RecyclerView

    文章目录 ListView 内置类型的简单运用 定制数据类型 提升效率 点击事件 RecyclerView 布局管理器 点击事件 ListView 内置类型的简单运用 由于手机屏幕空间有限,能够一次性 ...

  9. 如何将参数传递给setTimeout()回调?

    我有一些如下的JavaScript代码: function statechangedPostQuestion() {//alert("statechangedPostQuestion&quo ...

最新文章

  1. Linux 高级存储管理
  2. 前端学习(2520):环境搭建
  3. 每天中一次500万彩票,谷歌CEO 2019薪酬曝光,总计2.81亿美元
  4. 友盟消息推送服务器demo,友盟消息推送总结
  5. Hadoop--克隆3x虚拟机
  6. NIPS 又!放!票!了!
  7. Java类获取Spring容器的bean
  8. 吾在这里给大家拜年啦!
  9. Latex:IEEE Trans期刊Latex模板下载
  10. cad批量逐个填充lisp,效率提高之CAD如何自动批量导出文本
  11. 妇产科护理学复习重点
  12. Minimum supported Gradle version is 6.1.1. Current version is 5.6.4
  13. TransModeler 交通仿真软件
  14. SpringCloud Alibaba实战第九课 分布式事务理论、DevOps运维
  15. 调用第三方应用App
  16. 2013年运唐立淇——水瓶座
  17. 对称加密 非对称加密
  18. 最简单的视频网站(JavaEE+FFmpeg)
  19. 程序员去哪里找靠谱的兼职?(附项目库)
  20. matlab 模拟风,【Matlab实现】风场仿真

热门文章

  1. mysql语句转为oracle语句
  2. 数据库关键字(保留字)
  3. hping3的简单介绍(新手向,大佬勿喷)
  4. Java——图片格式转换
  5. JAVA设计模式之概述
  6. Idea在Maven项目中使用支付宝沙箱环境
  7. php 商品多规格的实现,sku实现
  8. 假设检验和P值那些事
  9. 2020长三角(上海)区块链应用创新大赛复赛评审圆满结束
  10. 通信协议英语单词解析