android 输入事件处理方法,10.10 android输入系统_APP获得并处理输入事件流程

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(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;//如果应用程序使用输入法,就从mFirstInputStage开始处理,如果不使用输入法,就从mFirstPostImeInputStage开始处理

stage.deliver(q)

InputStage stage的分析见下图

如果应用程序使用输入法,就从mFirstInputStage开始处理,如果不使用输入法,就从mFirstPostImeInputStage开始处理

4d6eafeffd63a3950d322dc6b08f74f1.png

原文:https://www.cnblogs.com/liusiluandzhangkun/p/9168935.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值