欢迎来到天天文库
浏览记录
ID:11476293
大小:122.00 KB
页数:16页
时间:2018-07-12
《mtk event 事件机制总结》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MTKMMIevent小结1在MTKMMI里面有各种event,最常见的有跟交互相关的按键event,触摸屏event。跟各种具体事件比如电话event,短信event,电量event,信号量event,timerevent等等。MTK都有相应的处理方式,跟交互相关的按键(KeyBrd.c)和触摸屏(TouchScreen.c)各有一套自己的机子,timerevent已经在MTKtimer小结3介绍过,还有一套机制就是处理各种其他事件,它主要分为普通事件和interruptevent,interrupte
2、vent主要用于需要弹出的对话框的event。MTKMMIevent小结2今天主要看分析,常用事件机制。做过MTK开发的童鞋应该知道要接受MTKL4层的消息,用一个注册函数SetProtocolEventHandler,注册一个event的处理函数。比如短信,电话,电池电量,信号量等等都是通过这个函数来注册消息。当L4层处理完封装事件后,就会把这个event发送到MMItask里来(消息发送可以看MTKtask小结5),然后MMItask通过这个event机制,找到相应的处理函数,进行处理。实现这种机制,
3、也是考虑到零活性和扩张性。如果都在MMItask里面,用switchcase来处理,那就很疯狂了,长度不说,写个应用,定义个消息,都要去改MMItask,所以这个机制实现虽然比较简单,但是还是很有必要的。昨天也说到,这个机制的event主要有两种,普通event和intrruptevent(中断事件),这些主要是一些需要中断当前应用的事件(主要是看那些弹出框),比如电话,有些应用需要提前处理这个消息,还有些应用需要在这个事件处理完毕后处理。还是看代码吧在MMItask最后,会调用函数ProtocolEve
4、ntHandler,这个函数就是找到相应event的相应处理函数(平台不一样,可能实际的函数名字有些区别,但是流程基本上一样的,我这里被#define到mmi_frm_execute_current_protocol_handler)注意:event的处理函数使用SetProtocolEventHandler来注册。//MsgStruct是具体事件的消息体voidmmi_frm_execute_current_protocol_handler(U16eventID,void*MsgStruct,intmo
5、d_src,void*peerBuf){U16count=0;PsExtPeerFuncPtrcurrFuncPtr=NULL;U8interrup_result=MMI_FALSE;/*Falsenothandleinterrupt,Truewillhandle*/MMI_BOOLquery_result=MMI_FALSE,execute_result=MMI_FALSE;interrupt_event_hdlrint_func=NULL,post_int_func=NULL;mmi_frm_int_
6、event_typecurrent_frm_int_event;idx=mmi_frm_search_event();{//遍历protocolEventHandler查找是否有event注册了回调函数//虽然这个方法感觉比较笨,就一个数组,实际上对速度没有什么影响for(count=0;count7、rFuncPtr)protocolEventHandler[count].entryFuncPtr;//这个地方时,一个优化//处理的事情就是把刚才现在处理的eventid往前移动一个单位//这是考虑到程序的局部性原理,这个优化还是很有必要的if(count>0){protocolEventHandler[count].eventID=protocolEventHandler[count-1].eventID;protocolEventHandler[count].entryFuncPtr=protoco8、lEventHandler[count-1].entryFuncPtr;protocolEventHandler[count-1].eventID=eventID;protocolEventHandler[count-1].entryFuncPtr=(PsFuncPtr)currFuncPtr;}break;}}}//这个就是查找是否是中断事件current_frm_int_event=mmi_frm_interrupt_ev
7、rFuncPtr)protocolEventHandler[count].entryFuncPtr;//这个地方时,一个优化//处理的事情就是把刚才现在处理的eventid往前移动一个单位//这是考虑到程序的局部性原理,这个优化还是很有必要的if(count>0){protocolEventHandler[count].eventID=protocolEventHandler[count-1].eventID;protocolEventHandler[count].entryFuncPtr=protoco
8、lEventHandler[count-1].entryFuncPtr;protocolEventHandler[count-1].eventID=eventID;protocolEventHandler[count-1].entryFuncPtr=(PsFuncPtr)currFuncPtr;}break;}}}//这个就是查找是否是中断事件current_frm_int_event=mmi_frm_interrupt_ev
此文档下载收益归作者所有