前言:基于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动态加载――加载已安装APK中的类
  2. [置顶] Android开发之动态库调用
  3. android点滴(8) -- android应用程序的生命周期
  4. android 文件上传的类--完整 可以直接被调用的
  5. 探讨android图片资源的抖动处理和格式转换
  6. android反射调用
  7. 解析Android消息处理机制:Handler/Thread/Looper & MessageQueue
  8. android IPC及原理简介
  9. Android(安卓)Service

随机推荐

  1. Android(安卓)投屏实现纪要
  2. Android View (transship)
  3. AutoHomeRefreshListView仿汽车之家下拉
  4. Android镜像烧写(Ubuntu)
  5. android的意图
  6. android canvas drawText 使用说明
  7. android闹钟程序实现铃声
  8. Android Studio3.2 Butter Knife配置填坑
  9. 安卓屏幕适配
  10. android studio的安装信息