前言:基于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),扫一扫下方二维码或搜索微信号coder_online即可关注,我们可以在线交流。


  • 上一篇vim 高级使用技巧第二篇


更多相关文章

  1. Rexsee API介绍:Android屏幕锁定,Keyguard函数与扩展源码
  2. Android中处理崩溃异常
  3. android 4.0.1 webkit Event 事件处理过程分析
  4. Android单元测试详解(以公司产品demo为案例)
  5. Android(安卓)WebView调用Js设置byte[]给Img src
  6. Android下USB框架
  7. Android(安卓)NDK的基本使用,这一篇就够了
  8. 2012.06.28(2)——— android onMeasure和onLayout
  9. Android的休眠与唤醒

随机推荐

  1. Android下使用OpenCV
  2. Android与J2ME区别之我见(3)
  3. 2D翻转
  4. 写给Android开发者的Kotlin入门
  5. Android公共库选型 单元测试 依赖管理等
  6. (推荐)彻底解析Android缓存机制——LruCach
  7. 我的第一个python脚本
  8. Android之Handle全面理解
  9. ADB WIFI DEBUG(ANDROID STUDIO)
  10. android中的键盘处理