一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android webkit 事件傳遞流程通道分析

 wusiqi111 2019-04-24

前言:基于android webview 上定制自己使用的可移植瀏覽器apk,遇到好多按鍵處理的問題。所以索性研究了一下keyevent 事件的傳遞流程。

frameworks 層

keyevent 事件開始是從/frameworks/base/core/java/android/webkit目錄下WebViewClassic.java

中的onKeyDown() 函數(shù)開始的

          // 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是不是系統(tǒng)按鍵,或者調用webview應用處理event。系統(tǒng)按鍵直接返回,

如果webview應用處理了也直接返回。

其它key事件調用 sendKeyEvent(event),在sendKeyEvent() 又調用sendBatchableInputMessage()

在這個函數(shù)中又調用mWebViewCore.sendMessage(message)

將event封裝成Message傳遞給WebViewCore.java中的EventHub 類

在sendMessage()函數(shù)又通過它發(fā)送到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); 

WebCore對接層

此時調用進入Source/WebCore/page 中的EventHandler.cpp

它會區(qū)分為keyup keydown keypress 事件發(fā)送到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中實現(xiàn)注冊監(jiān)聽

bool EventTarget::fireEventListeners(Event* event) 

 registeredListener.listener->handleEvent(scriptExecutionContext(), event); 

發(fā)送到注冊監(jiān)聽的javascript中。

如果在js中注冊了一個keypress事件處理而我們要兼容支持它我們可以只動WebViewClassic.java或者在app層代碼實現(xiàn)轉換并傳入js中即可。

在WebViewClassic.java中實現(xiàn)了passVirtualKeyEvent(int KeyCode)。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产亚洲精品香蕉视频播放| 国产熟女一区二区三区四区| 中文久久乱码一区二区| 亚洲国产精品肉丝袜久久| 日韩国产传媒在线精品| 在线观看欧美视频一区| 成人午夜激情在线免费观看| 亚洲中文字幕在线观看四区| 国产精品内射婷婷一级二级| 台湾综合熟女一区二区| 日本美国三级黄色aa| 小黄片大全欧美一区二区| 中文字幕日韩无套内射| 日韩精品中文字幕在线视频| 狠狠干狠狠操亚洲综合| 五月综合激情婷婷丁香| 亚洲欧美国产网爆精品| 激情内射亚洲一区二区三区| 久久99青青精品免费| 亚洲国产欧美久久精品| 少妇激情在线免费观看| 欧美国产在线观看精品| 久久精品亚洲精品国产欧美| 欧美特色特黄一级大黄片| 欧美激情视频一区二区三区| 欧美精品久久男人的天堂| 欧美人与动牲交a精品| 91超精品碰国产在线观看| 亚洲中文字幕日韩在线| 午夜福利92在线观看| 中国美女草逼一级黄片视频| 亚洲男人的天堂色偷偷| 成人国产激情在线视频| 国产毛片对白精品看片| 国产91色综合久久高清| 99精品人妻少妇一区二区人人妻| 日韩不卡一区二区三区色图| 亚洲av熟女一区二区三区蜜桃| 国产av精品一区二区| 午夜久久久精品国产精品| 日韩亚洲精品国产第二页|