zoukankan      html  css  js  c++  java
  • Android webkit keyevent 事件传递过程

    前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题。所以索性研究了一下keyevent 事件的传递流程。

    frameworks 层

    keyevent 事件开始是从/frameworks/base/core/java/android/webkit目录下WebViewClassic.java

    中的onKeyDown() 函数开始的

              // Bubble up the key event if
              // 1. it is a system key; or
              // 2. the host application wants to handle it;
              if ((event.isSystem() || mCallbackProxy.uiOverrideKeyEvent(event))

     这个的作用是判断event是不是系统按键,或者调用webview应用处理event。系统按键直接返回,

    如果webview应用处理了也直接返回。

    其它key事件调用 sendKeyEvent(event),在sendKeyEvent() 又调用sendBatchableInputMessage()

    在这个函数中又调用mWebViewCore.sendMessage(message)

    将event封装成Message传递给WebViewCore.java中的EventHub 类

    在sendMessage()函数又通过它发送到Handler在transferMessages() 中handleMessage()处理keydown事件

              case KEY_DOWN:                                                                                                                 
                      key((KeyEvent) msg.obj, msg.arg1, true);
                      break;

    webkit 层

    key中调用nativeKey() 将事件传入webkit中Source/WebKit/android/jni WebViewCore.cpp中的

        { "nativeKey", "(IIIIZZZZ)Z",                                                                                                                     
            (void*) Key },

    WebViewCore::key(const PlatformKeyboardEvent& event)

    eventHandler->keyEvent(event); 

    此时调用进入Source/WebCore/page 中的EventHandler.cpp

    它会区分为keyup keydown keypress 事件发送到Node中处理

     bool Node::dispatchEvent(PassRefPtr<Event> event)
      {                
          return EventDispatcher::dispatchEvent(this, EventDispatchMediator(event));                                                   } 

    通过中转最终调用到EventDispatcher.cpp中

    bool EventDispatcher::dispatchEvent(PassRefPtr<Event> event)

    m_node->handleLocalEvents(event.get());

    在Node.cpp 中调用

    fireEventListeners(event); 

    class Node : public EventTarget  Node继承了EventTarget

    EventTarget.cpp中实现注册监听

    bool EventTarget::fireEventListeners(Event* event) 

     registeredListener.listener->handleEvent(scriptExecutionContext(), event); 

    发送到注册监听的javascript中。

    如果在js中注册了一个keypress事件处理而我们要兼容支持它我们可以只动WebViewClassic.java或者在app层代码实现转换并传入js中即可。

    在WebViewClassic.java中实现了passVirtualKeyEvent(int KeyCode)。

     如有问题和需要请留言,我会为您解答问题。

     扫一扫下方二维码或搜索微信号程序员互动联盟(coder_online)即可关注,我们可以在线交流

  • 相关阅读:
    无法嵌入互操作类型“ADOX.CatalogClass”。请改用适用的接口。
    编码:隐匿在计算机软硬件背后的语言(3)--二进制加法器
    编码:隐匿在计算机软硬件背后的语言(2)--二进制
    C#中Mutex的用法
    C#中创建二维数组,使用[][]和[,]的区别
    git同时存在两个账号(在同一台电脑上)——三步完成(已修正)
    C++之标准库vector
    C++之标准库map
    sublime和vscode 格式化Json ——两步走
    二十八、linux下权限管理chmod
  • 原文地址:https://www.cnblogs.com/yistn/p/4383467.html
Copyright © 2011-2022 走看看