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)

原文发表时间:2015-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯移动品质中心TMQ的专栏

Android手机上用户操作模拟方法的研究与实现

一、 问题背景 最近研究了一下Android手机上用户操作的模拟方法, 有一些心得与大家分享下。 之所以去研究Android手机上用户操作的模拟方法,是因为最...

3086
来自专栏技术博客

Asp.Net Web API 2第十五课——Model Validation(模型验证)

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.h...

452
来自专栏腾讯移动品质中心TMQ的专栏

结合静态代码扫描来给插件间接口把把脉

如火如荼的EP建设中小鹅收到了一个小小的需求,如何知道每个版本变更了哪些插件间接口呢,有没有及时覆盖?

1926
来自专栏java达人

说说JSON和JSONP( 含jquery例子)

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义...

2155
来自专栏烂笔头

Selenium Webdriver常用方法

目录[-] 实例化方法 from selenium import webdriver driver = webdriver.Chrome(executabl...

4558
来自专栏菩提树下的杨过

Enterprise Library 4.1学习笔记4----缓存应用程序块

缓存是个啥?以及为啥要用缓存就不废话了,主要是从实用角度讲下怎么用 1.先添加对Microsoft.Practices.EnterpriseLibrary.Ca...

1606
来自专栏FreeBuf

一个二进制POC的诞生之旅CVE-2018-0802

背景 在潜伏17年的“噩梦公式”漏洞(CVE-2017-11882)被曝光修补之后,之前的漏洞程序EQNEDT32.EXE在windows 10系统下仍然没有开...

2219
来自专栏木宛城主

Thinking In Design Pattern——MVP模式演绎

目录 What Is MVP Domain Model StubRepositoty IView & Presenter View Ioc容器Structure...

20210
来自专栏代码GG之家

google 分屏 横屏模式 按home键界面错乱故障分析(二)

google 进入分屏后在横屏模式按home键界面错乱(二) 你确定你了解分屏的整个流程? ? Android 关机对话框概率没有阴影故障分析 android ...

20110
来自专栏python学习路

九、Python发送QQ邮件(SMTP)

看了廖雪峰老师的教程: 一封电子邮件的旅程就是 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人 ...

3563

扫描关注云+社区