日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用程序键盘(Keyboard)消息处理机制分析(14)

發布時間:2025/5/22 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序键盘(Keyboard)消息处理机制分析(14) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?3.?InputManager分發鍵盤消息給應用程序的過程分析

?? ? ? ?在分析InputManager分發鍵盤消息給應用程序的過程之前,我們先假設現在沒有鍵盤事件發生,因此,InputManager中的InputReader正在睡眠等待鍵盤事件的發生,而InputManager中的InputDispatcher正在等待InputReader從睡眠中醒過來并且喚醒它,而應用程序也正在消息循環中等待InputDispatcher從睡眠中醒過來并且喚醒它。這時候,用戶按下鍵盤中的一個鍵,于是,一系列喚醒的事件就依次發生了,一直到應用程序中正在顯示的Activity得到通知,有鍵盤事件發生了。我們先來看這個過程的序列圖,然后再詳細分析每一個步驟:

? ? ? ? Step 1. InputReader.pollOnce

?? ? ? ?Step 2. EventHub.getEvent

?? ? ? ?這兩個函數分別定義在frameworks/base/libs/ui/InputReader.cpp和frameworks/base/libs/ui/EventHub.cpp文件中,前面我們在分析InputManager的啟動過程的Step 17和Step 18時,已經看到過這兩個函數了。InputReaderThread線程會不民地循環調用InputReader.pollOnce函數來讀入鍵盤事件,而實際的鍵盤事件讀入操作是由EventHub.getEvent函數來進行的。如果當前沒有鍵盤事件發生,InputReaderThread線程就會睡眠在EventHub.getEvent函數上,而當鍵盤事件發生后,就會把這個事件封裝成一個RawEvent對象,然后返回到pollOnce函數中,執行process函數進一步處理:

  • void?InputReader::loopOnce()?{??
  • ????RawEvent?rawEvent;??
  • ????mEventHub->getEvent(&?rawEvent);??
  • ??
  • ????......??
  • ??
  • ????process(&?rawEvent);??
  • }??
  • ?? ? ? ?Step 3. InputReader.process

    ?

    ?? ? ? ?這個函數定義在frameworks/base/libs/ui/InputReader.cpp文件中:

  • void?InputReader::process(const?RawEvent*?rawEvent)?{??
  • ????switch?(rawEvent->type)?{??
  • ????case?EventHubInterface::DEVICE_ADDED:??
  • ????????addDevice(rawEvent->deviceId);??
  • ????????break;??
  • ??
  • ????case?EventHubInterface::DEVICE_REMOVED:??
  • ????????removeDevice(rawEvent->deviceId);??
  • ????????break;??
  • ??
  • ????case?EventHubInterface::FINISHED_DEVICE_SCAN:??
  • ????????handleConfigurationChanged(rawEvent->when);??
  • ????????break;??
  • ??
  • ????default:??
  • ????????consumeEvent(rawEvent);??
  • ????????break;??
  • ????}??
  • }??
  • ?? ? ? ?當鍵盤事件發生時,rawEvent->type的值為EV_KEY,這是一個宏定義,具體可以參考bionic/libc/kernel/common/linux/input.h文件:

  • #define?EV_KEY?0x01??
  • ?? ? ? ?因此,接下來會調用consumeEvent函數進一步處理。

    ?

    ?? ? ? ?Step 4.?InputReader.consumeEvent

    ?? ? ? ?這個函數定義在frameworks/base/libs/ui/InputReader.cpp文件中:

  • void?InputReader::consumeEvent(const?RawEvent*?rawEvent)?{??
  • ????int32_t?deviceId?=?rawEvent->deviceId;??
  • ??
  • ????{?//?acquire?device?registry?reader?lock??
  • ????????RWLock::AutoRLock?_rl(mDeviceRegistryLock);??
  • ??
  • ????????ssize_t?deviceIndex?=?mDevices.indexOfKey(deviceId);??
  • ????????if?(deviceIndex?<?0)?{??
  • ????????????LOGW("Discarding?event?for?unknown?deviceId?%d.",?deviceId);??
  • ????????????return;??
  • ????????}??
  • ??
  • ????????InputDevice*?device?=?mDevices.valueAt(deviceIndex);??
  • ????????if?(device->isIgnored())?{??
  • ????????????//LOGD("Discarding?event?for?ignored?deviceId?%d.",?deviceId);??
  • ????????????return;??
  • ????????}??
  • ??
  • ????????device->process(rawEvent);??
  • ????}?//?release?device?registry?reader?lock??
  • }??
  • ?? ? ? ? 首先從rawEvent中取得觸發鍵盤事件設備對象device,然后調用它的process函數進行處理。

    ?

    ?? ? ? ? Step 5. InputDevice.process

    ?? ? ? ? 這個函數定義在frameworks/base/libs/ui/InputReader.cpp文件中:

  • void?InputDevice::process(const?RawEvent*?rawEvent)?{??
  • ????size_t?numMappers?=?mMappers.size();??
  • ????for?(size_t?i?=?0;?i?<?numMappers;?i++)?{??
  • ????????InputMapper*?mapper?=?mMappers[i];??
  • ????????mapper->process(rawEvent);??
  • ????}??
  • }??
  • ?? ? ? ? 這里的mMapper成員變量保存了一系列輸入設備事件處理象,例如負責處理鍵盤事件的KeyboardKeyMapper對象、負責處理軌跡球事件的TrackballInputMapper對象以及負責處理觸摸屏事件的TouchInputMapper對象, 它們是在InputReader類的成員函數createDevice中創建的。這里查詢每一個InputMapper對象是否要對當前發生的事件進行處理。由于發生的是鍵盤事件,真正會對該事件進行處理的只有KeyboardKeyMapper對象。

    ?

    ?? ? ? ? Step 6.?KeyboardInputMapper.process

    ?? ? ? ??這個函數定義在frameworks/base/libs/ui/InputReader.cpp文件中:

  • void?KeyboardInputMapper::process(const?RawEvent*?rawEvent)?{??
  • ????switch?(rawEvent->type)?{??
  • ????case?EV_KEY:?{??
  • ????????int32_t?scanCode?=?rawEvent->scanCode;??
  • ????????if?(isKeyboardOrGamepadKey(scanCode))?{??
  • ????????????processKey(rawEvent->when,?rawEvent->value?!=?0,?rawEvent->keyCode,?scanCode,??
  • ????????????????????rawEvent->flags);??
  • ????????}??
  • ????????break;??
  • ????}??
  • ????}??
  • }??
  • ?? ? ? ?這個函數首先會檢查一下鍵盤掃描碼是否正確,如果正確的話,就會調用processKey函數進一步處理。

    ?

    ?

    ?

    轉載于:https://blog.51cto.com/shyluo/966632

    總結

    以上是生活随笔為你收集整理的Android应用程序键盘(Keyboard)消息处理机制分析(14)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 五月天婷婷丁香 | 日韩免费三级 | 久草黄色 | 亚洲欧美一区二区三区情侣bbw | av日韩一区 | 男男h黄动漫啪啪无遮挡软件 | 国产一级性生活片 | 国产区一区二 | 色呦呦中文字幕 | 欧美人与性动交g欧美精器 国产在线视频91 | 俺啪也| 国产精品视频在线观看 | 亚洲综合色婷婷 | 99色播 | 99香蕉网 | 黄色不打码视频 | 久久狠狠爱 | 精品中文字幕视频 | 怡红院成人影院 | 九一国产视频 | 国产精品99久久久久久大便 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 亚洲性欧美色 | 波多野结衣中文字幕久久 | 蜜桃视频中文字幕 | 人妻 校园 激情 另类 | jiizzyou欧美2| 中文在线字幕 | 日韩女优在线观看 | 东北高大丰满bbbbzbbb | 毛片视频免费观看 | 国产精品污www一区二区三区 | 中文字幕avav | www.亚洲激情 | 香蕉久久网站 | 波多野结衣一区 | 九九热免费在线 | 一本久久道 | 久操久热 | 中文字幕23页 | 91精品区 | 国产91九色 | 无码人妻aⅴ一区二区三区玉蒲团 | www.在线播放 | 国产黄色精品视频 | 先锋影音在线 | 国产欧美日韩在线 | 国产三级视频 | 91av视频在线免费观看 | 少妇又色又紧又大爽又刺激 | 热久久精 | 亚洲自拍网站 | 蜜桃网站 | 先锋影音av中文字幕 | 亚洲一区欧洲二区 | 国产爆操视频 | 男女又爽又黄 | 噜噜噜视频| 国产精品sm调教免费专区 | 少妇紧身牛仔裤裤啪啪 | 欧美挤奶吃奶水xxxxx | 国产一级片免费播放 | 69亚洲| 色老太hd老太色hd | 国产强被迫伦姧在线观看无码 | 91麻豆蜜桃一区二区三区 | 日韩在线观看免费网站 | 日本午夜免费福利视频 | 久久第一页 | 日韩小视频 | 国产第一网站 | 国产成人精品自拍 | 美女131爽爽爽做爰视频 | 国产成人一级片 | 亚洲国产精品视频一区 | 日本污网站 | 少妇流白浆 | a猛片免费播放 | 久久99精品久久久久久水蜜桃 | 一本久道视频一本久道 | 人物动物互动39集免费观看 | 欧美日在线 | 免费在线a | 日韩二区三区 | 国产乱子伦一区二区 | 国模视频一区二区 | 欧美福利电影 | 日韩高清中文字幕 | 自拍偷拍视频在线 | 黄色性生活一级片 | 成人做受视频试看60秒 | 国产激情一区二区三区视频免樱桃 | 玖玖精品视频 | 黄色日b片 | 国产a线| 九一在线观看免费高清视频 | 91精品国产麻豆 | 久久国产精品网站 | 综合成人在线 |