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

來源:互聯網
上載者:User

標籤:

前言:基於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); 

 

WebCore對接層

此時調用進入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即可關注,我們可以線上交流。

                                                                 


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.