前言:基于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);

WebCore层

此时调用进入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),扫一扫下方二维码或搜索微信号coder_online即可关注,我们可以在线交流。

                                                                 

Android webkit 事件传递流程详解的更多相关文章

  1. Android Touch事件传递机制详解 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  2. Android 的事件传递机制,详解

    Android 的事件传递机制,详解 前两天和一个朋友聊天的时候.然后说到事件传递机制.然后让我说的时候,忽然发现说的不是非常清楚,事实上Android 的事件传递机制也是知道一些,可是感觉自己知道的 ...

  3. Android webkit 事件传递流程通道分析

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

  4. Android Touch事件传递机制详解

    Android开发的朋友经常处理各种触摸事件,然而在触摸事件的传递过程中主要用到三个方法:dispatchTouchEvent().onInterceptTouchEvent()和onTouchEve ...

  5. Android Touch事件传递机制详解 上

    最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘 ...

  6. Android事件传递机制详解及最新源码分析——ViewGroup篇

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...

  7. Android事件传递机制详解及最新源码分析——View篇

    摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于安卓事件传递机制相信绝大部分开发者都听说过或者了解过,也是面试中最常问的问题之一.但是真正能从源码角度理解具体事件传递流程的相信并不多, ...

  8. Android开发——事件分发机制详解

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52566965 深入学习事件分发机制,是为了解决在Android开发中 ...

  9. Android按键事件传递流程(二)

    5    应用层如何从Framework层接收按键事件 由3.2和4.5.4节可知,当InputDispatcher通过服务端管道向socket文件描述符发送消息后,epoll机制监听到了I/O事件, ...

随机推荐

  1. hadoop学习笔记之倒排索引

    开发工具:eclipse 目标:对下面文档phone_numbers进行倒排索引: 13599999999 1008613899999999 12013944444444 13800138000137 ...

  2. Java学习笔记之接口

    一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(Str ...

  3. 使用GLSL实现的海洋效果 【转】

    http://bbs.osgchina.org/viewthread.php?tid=342&extra=page%3D3 虽说自己原创的部分并不算多,不过总算是调试通过了,中间有多次严重的死 ...

  4. OverHust

    https://github.com/fanhongwei/OverHust https://github.com/eltld/OverHust

  5. android之多媒体篇(二)

    管理音频焦点 情景:当你的app隐退到后台,而其他也有播放能力的app浮现在前台,这个时候,你可能要暂停你原有app的播放功能,和解除监听Media Button,把控制权交给前台的APP. 这就需要 ...

  6. iOS开发——UI篇Swift篇&UIImageView

    UIImageView override func viewDidLoad() { super.viewDidLoad() titleLabel.text = titleString //通过坐标和大 ...

  7. qt creator中使用qwt插件

    前提:我用mingw编译的qwt. 将qwt插件集成到qt designer非常easy.仅仅要把qwt编译的qwt_designer_plugin.dll复制到C:\Qt\Qt5.3.1\5.3\m ...

  8. [原创]SSIS-WMI 数据读取器任务:监控物理磁盘空间

    背景:       随着时间的推移,我们的DW会越来越大,也就意味着磁盘空间会越来越小,那如果哪一天留意不当,就会造成磁盘空间的不足而导致ETL失败,最终影响我们的系统的数据正确性和使用,更严重的有可 ...

  9. 关于修改Android手机的音量

    首先,必须要获取系统的声音服务权限 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS&qu ...

  10. Xamarin自学教程(Android)之一

    废话少说,我们直接开始吧.有兴趣的就一起,我慢慢写,咱们一起慢慢学.希望两个月内能基本完成基于Xamarin的Android开发内容. 还是一样,先来安装开发环境吧.跟着做就行了. 首先,我们到微软的 ...