Android应用程序键盘(Keyboard)消息处理机制分析(8)
生活随笔
收集整理的這篇文章主要介紹了
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;?? ????????}?? ????}?? }?? int?pollResult?=?poll(mFDs,?mFDCount,?-1);??
?? ? ? ?接著,再檢查是否需要結束監控輸入事件:
?? ? ? ?最后,就是要檢查當前是否有還未處理的輸入設備事件發生了:
?? ? ? ?未處理的輸入事件保存在成員變量mInputBufferData中,如果有的話,就可以直接返回了,否則的話,就要通過系統調用poll來等待輸入設備上發生新的事件了,在我們這個場景中,就是等待鍵盤有鍵被按下或者松開了。:
?
?? ? ? ?這里的mFDs包含了我們所要監控的輸入設備的打開文件描述符,這是在前面的openPlatformInput函數中初始化的。
轉載于:https://blog.51cto.com/shyluo/966621
總結
以上是生活随笔為你收集整理的Android应用程序键盘(Keyboard)消息处理机制分析(8)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国银行白金卡宽限期信用卡
- 下一篇: Android应用程序键盘(Keyboa