標籤:isp first ext this post false jpg response mes
APP對fd/InputChannel的註冊過程:
new WindowInputEventReceiver extends InputEventReceiver//InputEventReceiver類的dispatchInputEvent函數會調用onInputEvent
onInputEvent函數在收到事件後被調用//被父類的dispatchInputEvent調用
在InputEventReceiver的建構函式中調用nativeInit
nativeInit//從java進入C++
new NativeInputEventReceiver
consumeEvents//調用Java層的函數dispatchInputEvent
dispatchInputEvent
最後會把fd加入epoll去監控
APP獲得並處理輸入事件流程
pollOnce
polInner
epoll_wait//等待各種事件的發生
pushResponse(events,mRequests.valueAt(requestIndex))構造response放入某個緩衝區
Response& response = mResponses.editItemAt(i)//從緩衝取出response
int callbackResult = response.request.callback->handleEvent(fd,events,data)
consumeEvents(env,false,-1,NULL)
mInputConsumer.consume(...,&seq,&inputEvent)
mChannel->receiveMessage(&mMsg)
nRead = ::recv(mFD,msg,sizeof(InputMessage),MSG_DONTWAIT)
initializeKeyEvent(keyEvent,&mMsg)
*outSeq = mMsg.body.key.seq
*outEvent = keyEvent
inputEventObj = android_view_KeyEvent_fromNative(env,static_cast<KeyEvent*>(inputEvent))
env->CallVoidMethod(receiverObj.get(),gInputEventReceivrrClassInfo.dispatchInputEvent,seq,inputEventObj)
onInputEvent(event)
enqueueInputEvent(event,this,0,true)
mPendingInputEventTail =q
doProcessInputEvents//處理眾多的輸入事件
QueueInputEvent q = mPendingInputEventHead;
mPendingInputEventHead = q.mNext
deliverInputEvent(q)
stage = q.shouldSkipIme()?mFirstPostImeInputStage:mFirstInputStage;//如果應用程式使用IME,就從mFirstInputStage開始處理,如果不使用IME,就從mFirstPostImeInputStage開始處理
stage.deliver(q)
InputStage stage的分析見
如果應用程式使用IME,就從mFirstInputStage開始處理,如果不使用IME,就從mFirstPostImeInputStage開始處理
10.10 android輸入系統_APP獲得並處理輸入事件流程