android 窗口信息传递给inputdispatcher

Android入门之把窗口信息传递给InputDispatcher

标签: Android窗口信息InputDispatcher传递
730人阅读 评论(0) 收藏 举报
分类:

        当窗口信息变化时,就应该把变化后的窗口信息传递给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(),我们主要关注该方法中的以下代码:

  1. mInputManager.setInputWindows(mTempInputWindows.toNullTerminatedArray());  

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

  1. public void setInputWindows(InputWindow[] windows) {  
  2.     nativeSetInputWindows(windows);  
  3. }  

        nativeSetInputWindows方法代码如下所示:

  1. void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowObjArray) {  
  2.     Vector<InputWindow> windows;  
  3.   
  4.     jsize length = env->GetArrayLength(windowObjArray);  
  5.     for (jsize i = 0; i < length; i++) {  
  6.         jobject inputTargetObj = env->GetObjectArrayElement(windowObjArray, i);  
  7.         if (! inputTargetObj) {  
  8.             break// found null element indicating end of used portion of the array  
  9.         }  
  10.   
  11.         windows.push();  
  12.         InputWindow& window = windows.editTop();  
  13.         bool valid = populateWindow(env, inputTargetObj, window);  
  14.         if (! valid) {  
  15.             windows.pop();  
  16.         }  
  17.   
  18.         env->DeleteLocalRef(inputTargetObj);  
  19.     }  
  20.   
  21.     mInputManager->getDispatcher()->setInputWindows(windows);  
  22. }  


        最后的getDispatcher()->setInputWindows顺利把窗口信息传递给了InputDispatcher。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值