日韩性视频-久久久蜜桃-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 黄色在线不卡 | 两性午夜免费视频 | 亚洲一区免费看 | 四虎影院在线视频 | 久久久蜜桃一区二区 | 婷婷六月在线 | 亚洲欧洲色| 国产r级在线 | 久久久久久蜜桃一区二区 | 午夜小视频在线观看 | 波多野结衣国产 | 欧美在线视频观看 | 一女双乳被两男吸视频 | 日韩蜜桃视频 | 乌克兰av在线 | 欧美a v在线播放 | 一区二区三区欧美在线 | 国产精品17p| 男人桶女人桶爽30分钟 | 欧美亚洲成人网 | 欧美一级特黄aaaaaa大片在线观看 | 国产一区二区三区自拍 | 狂野欧美性猛交免费视频 | 一级空姐毛片 | 天天摸夜夜添 | 亚洲精华国产精华精华液网站 | 四虎永久网址 | 三级黄色免费片 | 黑人巨大精品人妻一区二区 | 一区久久| 亚洲黄色网址大全 | 日韩成人午夜电影 | 成人网在线视频 | 人人爽视频 | 无码一区二区波多野结衣播放搜索 | 伊人五月天| 日本欧美另类 | 精品98| 国产99视频在线 | 久久视频一区二区 | 国产精品一区二区精品 | 女女h百合无遮涩涩漫画软件 | 91美女啪啪| 最新永久地址 | 欧美精品一区二区视频 | 成a人片亚洲日本久久 | 欧美九九九| 亚洲18在线看污www麻豆 | 一区二区成人av | 国产18在线| 亚洲成年人 | 国产农村妇女aaaaa视频 | 91在线无精精品白丝 | 亚欧美一区二区三区 | 影音av在线| 狠狠97| 91久久精品日日躁夜夜躁欧美 | 97精品国产97久久久久久春色 | av手机免费在线观看 | 欧美日韩亚洲精品内裤 | 国产成人无遮挡在线视频 | 国产精品视频123 | 天堂视频免费 | 女生被草 | 精品在线一区二区三区 | 精品视频一区二区三区 | 91涩漫成人官网入口 | 亚洲精品观看 | 久久久久久久女国产乱让韩 | 亚洲精品 欧美 | 日本免费一二三区 | 天天摸天天看 | 天堂av在线网 | 久久久久久99精品久久久 | 波多野结衣av一区二区全免费观看 | 久久精品无码专区免费 | 天天爽天天操 | av大全在线观看 | 亚洲天堂2016 | 97国产在线观看 | 少妇一区二区三区 | 成人免费在线 | 欧美精品一区二区三区蜜臀 | 日韩亚洲一区二区三区 | 日本午夜视频在线观看 | 巨胸喷奶水www久久久免费动漫 | 特黄视频免费看 | 日本黄色视屏 | 看黄色一级大片 | 国产亚洲一区二区三区四区 | 日韩在线小视频 | 欧美爱爱免费视频 | 日韩激情免费 | 国产精品成人自拍 | 丰满少妇高潮一区二区 | 青青操在线观看视频 | 亚洲精品观看 | www.猫咪av.com| 成人网在线免费观看 |