Android入门之把窗口信息传递给InputDispatcher
来源:互联网 发布:淘宝店铺永久封店重开 编辑:程序博客网 时间:2024/05/15 23:08
当窗口信息变化时,就应该把变化后的窗口信息传递给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);}
0 0
- Android入门之把窗口信息传递给InputDispatcher
- android 窗口信息传递给inputdispatcher
- 父窗口传递信息给子窗口
- Android 输入系统之InputDispatcher篇
- MFC多线程--把当前窗口所有传递给线程函数
- QT5入门之33-窗口数据传递
- android 父窗口和子窗口之间的信息传递
- Android输入子系统之InputDispatcher分发键盘消息过程分析
- Android 5.0输入系统分析之InputDispatcher线程分析
- 窗口信息传递
- C# 窗口传递信息
- Android JNI 把Java数组传递给C
- Android 入门之参数传递
- Android入门之数据传递
- Android入门之窗口类型
- 把数组传递给函数
- 【Android开发】从Activity传递信息给Fragment
- 一个包含上传控件的用户控件把信息传递给包含页面的方法
- SqlServer 2008 数据库练习----各种琐碎
- 关于style bad Entry 的错误 (纠结了几天的bug!)
- Maven-Nexus私服搭建(四)
- Intel 64 and IA-32 cache 术语
- SocketAsyncEventArgs
- Android入门之把窗口信息传递给InputDispatcher
- error LNK2019: 无法解析的外部符号 _xxxx,该符号在函数 _VisualEn_Run 中被引用
- 【编程基础】——抽象类&&接口&&继承
- java多线程—概念—菜鸟的进阶
- 字符串中第一个只出现一次的字符
- solrCloud配置目录结构
- lua 中table的使用和分析
- 如何刻录光盘?
- 火狐JSONView 安装