Android入门之把窗口信息传递给InputDispatcher
当窗口信息变化时,就应该把变化后的窗口信息传递给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相关推荐
- 怎么将hashmap的数据传递给js_将Excel数据信息传递给Powerpoint应用
大家好,我们今日讲解"VBA信息获取与处理"教程中第十六个专题"将Excel信息传递给Powerpoint及文本文件"的第一节"将Excel数据信息传 ...
- android中的add方法,Android入门之addWindow
前面说到,应用程序添加窗口时,会在本地创建一个ViewRoot,然后通过IPC(进程间通信)调用WmS的Session的addWindow请求WmS创建窗口,下面来看看addWindow方法. add ...
- Android 百度地图获取定位信息并实时传给后台
最近公司提了一个小case,因为公司物流师傅配送完货物后,通常回仓库都是空车,而这是严重的资源浪费,所以领导就给了一个小case,实时定位司机路线,先建立司机行车档案,在考虑其他业务,反正也是比较空, ...
- [转]Android入门基础教程
第1章 Android Studio运行第一个程序 1.1 Android Studio下载: 1.1.1 Android开发者官网: Android 开发者 | Android Develope ...
- Android入门知识全套笔记
安装apk: 开发完成之后,需要buildAPK,再次发送才能运行. adb install -r (apk完整路径) 安装在第三方app 系统级app需要把打包好的apk,浦西 卸载apk:adb ...
- Android入门文档
该文章为网络材料整理,部分内容经过重新编写. 一. 名词介绍 JDK:Java Development Kit Java 语言的软件开发工具包 JRE:Java Runtime Environment ...
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...
- Android入门(九)| 滚动控件 ListView 与 RecyclerView
文章目录 ListView 内置类型的简单运用 定制数据类型 提升效率 点击事件 RecyclerView 布局管理器 点击事件 ListView 内置类型的简单运用 由于手机屏幕空间有限,能够一次性 ...
- 如何将参数传递给setTimeout()回调?
我有一些如下的JavaScript代码: function statechangedPostQuestion() {//alert("statechangedPostQuestion&quo ...
最新文章
- Linux 高级存储管理
- 前端学习(2520):环境搭建
- 每天中一次500万彩票,谷歌CEO 2019薪酬曝光,总计2.81亿美元
- 友盟消息推送服务器demo,友盟消息推送总结
- Hadoop--克隆3x虚拟机
- NIPS 又!放!票!了!
- Java类获取Spring容器的bean
- 吾在这里给大家拜年啦!
- Latex:IEEE Trans期刊Latex模板下载
- cad批量逐个填充lisp,效率提高之CAD如何自动批量导出文本
- 妇产科护理学复习重点
- Minimum supported Gradle version is 6.1.1. Current version is 5.6.4
- TransModeler 交通仿真软件
- SpringCloud Alibaba实战第九课 分布式事务理论、DevOps运维
- 调用第三方应用App
- 2013年运唐立淇——水瓶座
- 对称加密 非对称加密
- 最简单的视频网站(JavaEE+FFmpeg)
- 程序员去哪里找靠谱的兼职?(附项目库)
- matlab 模拟风,【Matlab实现】风场仿真