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)即可关注,我们可以在线交流
最新文章
- Data组件的JSON数据格式
- POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
- 对于EL表达式和ONGL表达式区别的相关理解
- java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)
- 关于 System.IO.FileAttributes 的 Reparse Points
- 215. Kth Largest Element in an Array
- [原创]C语言利用pcre正则表达式库
- php和.net的DES加密解密方法
- JS复选框选中
- C语言基础题
- js模块化开发——require.js学习总结
- SpringBoot 整合 apollo
- MySQL按周统计 WEEK 实例
- Windows和pthread中提供的自旋锁
- 计算直线与WGS84椭球的交点
- JS如何遍历Object中的所有属性?
- Mysql的序列
- 并发库应用之四 &; 线程锁Lock应用
- myeclipse 修改freemarker ftl 不重启tomcat
- js时间戳转换日期
热门文章
- scala学习(3)-----wordcount【sparksession】
- Linux的net.ipv4.tcp_timestamps参数
- Vue.js 观察者(watch)
- 随机数生成工具类(中文姓名,性别,Email,手机号,住址)
- sql杂记:一些坑和数据库恢复
- Quadtrees(四分树)
- 2014年武汉的IT行情好像不太好(续):20个月过后,再看当时面试过的几个公司--武汉财富基石-崩盘,辣妈萌宝-创业失败,朋友公司转交他人管理
- 【OpenCV, C++】实现向下光栅追踪检测边缘
- VMWare学习总结(1)——Centos7安装完毕后无法联网的解决方法
- 47. Spring Boot发送邮件【从零开始学Spring Boot】