如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
MTKMMIevent小结1在MTKMMI里面有各种event,最常见的有跟交互相关的按键event,触摸屏event。跟各种具体事件比如电话event,短信event,电量event,信号量event,timerevent等等。MTK都有相应的处理方式,跟交互相关的按键(KeyBrd.c)和触摸屏(TouchScreen.c)各有一套自己的机子,timerevent已经在MTKtimer小结3介绍过,还有一套机制就是处理各种其他事件,它主要分为普通事件和interruptevent,interruptevent主要用于需要弹出的对话框的event。MTKMMIevent小结2今天主要看分析,常用事件机制。做过MTK开发的童鞋应该知道要接受MTKL4层的消息,用一个注册函数SetProtocolEventHandler,注册一个event的处理函数。比如短信,电话,电池电量,信号量等等都是通过这个函数来注册消息。当L4层处理完封装事件后,就会把这个event发送到MMItask里来(消息发送可以看MTKtask小结5),然后MMItask通过这个event机制,找到相应的处理函数,进行处理。实现这种机制,也是考虑到零活性和扩张性。如果都在MMItask里面,用switchcase来处理,那就很疯狂了,长度不说,写个应用,定义个消息,都要去改MMItask,所以这个机制实现虽然比较简单,但是还是很有必要的。昨天也说到,这个机制的event主要有两种,普通event和intrruptevent(中断事件),这些主要是一些需要中断当前应用的事件(主要是看那些弹出框),比如电话,有些应用需要提前处理这个消息,还有些应用需要在这个事件处理完毕后处理。还是看代码吧在MMItask最后,会调用函数ProtocolEventHandler,这个函数就是找到相应event的相应处理函数(平台不一样,可能实际的函数名字有些区别,但是流程基本上一样的,我这里被#define到mmi_frm_execute_current_protocol_handler)注意:event的处理函数使用SetProtocolEventHandler来注册。//MsgStruct是具体事件的消息体voidmmi_frm_execute_current_protocol_handler(U16eventID,void*MsgStruct,intmod_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_event_typecurrent_frm_int_event;idx=mmi_frm_search_event();{//遍历protocolEventHandler查找是否有event注册了回调函数//虽然这个方法感觉比较笨,就一个数组,实际上对速度没有什么影响for(count=0;count<maxProtocolEvent;count++){if(protocolEventHandler[count].eventID==eventID){//找到处理函数currFuncPtr=(PsExtPeerFuncPtr)protocolEventHandler[count].entryFuncPtr;//这个地方时,一个优化//处理的事情就是把刚才现在处理的eventid往前移动一个单位//这是考虑到程序的局部性原理,这个优化还是很有必要的if(count>0){protocolEventHandler[count].eventID=protocolEventHandler[count-1].eventID;protocolEventHandler[count].entryFuncPtr=protocolEventHandler[count-1].entryFuncPtr;protocolEventHandler[count-1].eventID=eventID;protocolEventHandler[count-1].entryFuncPtr=(PsFuncPtr)currFuncPtr;}break;}}}/