前言:基于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. Android中处理崩溃异常
  2. android 4.0.1 webkit Event 事件处理过程分析
  3. Android单元测试详解(以公司产品demo为案例)
  4. Android(安卓)WebView调用Js设置byte[]给Img src
  5. Android下USB框架
  6. Android(安卓)NDK的基本使用,这一篇就够了
  7. 2012.06.28(2)——— android onMeasure和onLayout
  8. Android的TextView的双击事件监听
  9. Android(安卓)webkit 事件传递流程

随机推荐

  1. [毕设记录] Android照相机基础基于camera
  2. android(java)对网络状态(socket)判断的方
  3. 简易android通讯录
  4. 带下拉列表的输入框
  5. Android中Intent传递对象的两种方法(Seri
  6. Android序列化Serializable和Parcelable
  7. android studio导入Xutils
  8. [置顶] 对Android的恶意吐槽(勿看,有毒)
  9. 解析 ViewTreeObserver 源码,体会观察者模
  10. 安装Android Studio遇到中文乱码的解决方