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

歡迎訪問 生活随笔!

生活随笔

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

Android

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

發布時間:2025/5/22 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序键盘(Keyboard)消息处理机制分析(8) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回到Step 18中,我們繼續分析EventHub.getEvent函數的實現。 在中間的for循環里面,首先會檢查當前是否有輸入設備被關閉,如果有,就返回一個設備移除的事件給調用方:
  • //?Report?any?devices?that?had?last?been?added/removed.??
  • if?(mClosingDevices?!=?NULL)?{??
  • ????device_t*?device?=?mClosingDevices;??
  • ????LOGV("Reporting?device?closed:?id=0x%x,?name=%s\n",??
  • ????????device->id,?device->path.string());??
  • ????mClosingDevices?=?device->next;??
  • ????if?(device->id?==?mFirstKeyboardId)?{??
  • ????????outEvent->deviceId?=?0;??
  • ????}?else?{??
  • ????????outEvent->deviceId?=?device->id;??
  • ????}??
  • ????outEvent->type?=?DEVICE_REMOVED;??
  • ????outEvent->when?=?systemTime(SYSTEM_TIME_MONOTONIC);??
  • ????delete?device;??
  • ????mNeedToSendFinishedDeviceScan?=?true;??
  • ????return?true;??
  • }??
  • 接著,檢查當前是否有新的輸入設備加入進來:
  • if?(mOpeningDevices?!=?NULL)?{??
  • ????device_t*?device?=?mOpeningDevices;??
  • ????LOGV("Reporting?device?opened:?id=0x%x,?name=%s\n",??
  • ????????device->id,?device->path.string());??
  • ????mOpeningDevices?=?device->next;??
  • ????if?(device->id?==?mFirstKeyboardId)?{??
  • ????????outEvent->deviceId?=?0;??
  • ????}?else?{??
  • ????????outEvent->deviceId?=?device->id;??
  • ????}??
  • ????outEvent->type?=?DEVICE_ADDED;??
  • ????outEvent->when?=?systemTime(SYSTEM_TIME_MONOTONIC);??
  • ????mNeedToSendFinishedDeviceScan?=?true;??
  • ????return?true;??
  • }??
  • ?? ? ? ?接著,再檢查是否需要結束監控輸入事件:

  • if?(mNeedToSendFinishedDeviceScan)?{??
  • ????mNeedToSendFinishedDeviceScan?=?false;??
  • ????outEvent->type?=?FINISHED_DEVICE_SCAN;??
  • ????outEvent->when?=?systemTime(SYSTEM_TIME_MONOTONIC);??
  • ????return?true;??
  • }??
  • ?? ? ? ?最后,就是要檢查當前是否有還未處理的輸入設備事件發生了:

  • //?Grab?the?next?input?event.??
  • for?(;;)?{??
  • ????//?Consume?buffered?input?events,?if?any.??
  • ????if?(mInputBufferIndex?<?mInputBufferCount)?{??
  • ????????const?struct?input_event&?iev?=?mInputBufferData[mInputBufferIndex++];??
  • ????????const?device_t*?device?=?mDevices[mInputDeviceIndex];??
  • ??
  • ????????LOGV("%s?got:?t0=%d,?t1=%d,?type=%d,?code=%d,?v=%d",?device->path.string(),??
  • ????????????(int)?iev.time.tv_sec,?(int)?iev.time.tv_usec,?iev.type,?iev.code,?iev.value);??
  • ????????if?(device->id?==?mFirstKeyboardId)?{??
  • ????????????outEvent->deviceId?=?0;??
  • ????????}?else?{??
  • ????????????outEvent->deviceId?=?device->id;??
  • ????????}??
  • ????????outEvent->type?=?iev.type;??
  • ????????outEvent->scanCode?=?iev.code;??
  • ????????if?(iev.type?==?EV_KEY)?{??
  • ????????????status_t?err?=?device->layoutMap->map(iev.code,??
  • ????????????????&?outEvent->keyCode,?&?outEvent->flags);??
  • ????????????LOGV("iev.code=%d?keyCode=%d?flags=0x%08x?err=%d\n",??
  • ????????????????iev.code,?outEvent->keyCode,?outEvent->flags,?err);??
  • ????????????if?(err?!=?0)?{??
  • ????????????????outEvent->keyCode?=?AKEYCODE_UNKNOWN;??
  • ????????????????outEvent->flags?=?0;??
  • ????????????}??
  • ????????}?else?{??
  • ????????????outEvent->keyCode?=?iev.code;??
  • ????????}??
  • ????????outEvent->value?=?iev.value;??
  • ??
  • ????????//?Use?an?event?timestamp?in?the?same?timebase?as??
  • ????????//?java.lang.System.nanoTime()?and?android.os.SystemClock.uptimeMillis()??
  • ????????//?as?expected?by?the?rest?of?the?system.??
  • ????????outEvent->when?=?systemTime(SYSTEM_TIME_MONOTONIC);??
  • ????????return?true;??
  • ????}??
  • ??
  • ????//?Finish?reading?all?events?from?devices?identified?in?previous?poll().??
  • ????//?This?code?assumes?that?mInputDeviceIndex?is?initially?0?and?that?the??
  • ????//?revents?member?of?pollfd?is?initialized?to?0?when?the?device?is?first?added.??
  • ????//?Since?mFDs[0]?is?used?for?inotify,?we?process?regular?events?starting?at?index?1.??
  • ????mInputDeviceIndex?+=?1;??
  • ????if?(mInputDeviceIndex?>=?mFDCount)?{??
  • ????????break;??
  • ????}??
  • ??
  • ????const?struct?pollfd&?pfd?=?mFDs[mInputDeviceIndex];??
  • ????if?(pfd.revents?&?POLLIN)?{??
  • ????????int32_t?readSize?=?read(pfd.fd,?mInputBufferData,??
  • ????????????sizeof(struct?input_event)?*?INPUT_BUFFER_SIZE);??
  • ????????if?(readSize?<?0)?{??
  • ????????????if?(errno?!=?EAGAIN?&&?errno?!=?EINTR)?{??
  • ????????????????LOGW("could?not?get?event?(errno=%d)",?errno);??
  • ????????????}??
  • ????????}?else?if?((readSize?%?sizeof(struct?input_event))?!=?0)?{??
  • ????????????LOGE("could?not?get?event?(wrong?size:?%d)",?readSize);??
  • ????????}?else?{??
  • ????????????mInputBufferCount?=?readSize?/?sizeof(struct?input_event);??
  • ????????????mInputBufferIndex?=?0;??
  • ????????}??
  • ????}??
  • }??
  • ?? ? ? ?未處理的輸入事件保存在成員變量mInputBufferData中,如果有的話,就可以直接返回了,否則的話,就要通過系統調用poll來等待輸入設備上發生新的事件了,在我們這個場景中,就是等待鍵盤有鍵被按下或者松開了。:

  • int?pollResult?=?poll(mFDs,?mFDCount,?-1);??
  • ?

    ?? ? ? ?這里的mFDs包含了我們所要監控的輸入設備的打開文件描述符,這是在前面的openPlatformInput函數中初始化的。

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

    總結

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

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