10A event mechanism

来源:互联网 发布:文博会淘宝财富故事 编辑:程序博客网 时间:2024/05/15 11:46

转自 http://wenku.baidu.com/view/f1e9c3bdfd0a79563c1e7235.html

event机制是MTK feature phone平台10A代码里面的最重要的机制之一.当某一个函数或者功能模块post或者send一个event之后,相关的就收函数就会去接收这个event然后做出相关的动作。 

问题在于:我们自己怎样使用event机制?怎样自己定义event,并使其得到认可(即生效)?怎样传递和接收? 可以通过以下步骤来实现自己定义event:
 一、event的定义 
    在相关的.h文件中枚举自己的event 例如: 
     #ifdef __HQ_WIDGET_FMRADIO_EVENT_HANDLE__ 
     typedef enum 
      { 
        FMRADIO_WIDGET_STATE_EXTERNAL_NONE = 0,    
        FMRADIO_WIDGET_STATE_EXTERNAL_PLAY 
      }FMRADIO_WIDGET_STATE_EXTERNAL_EVENT; 
     #endif 
    定义了2个event,一个是FMRADIO_WIDGET_STATE_EXTERNAL_NONE,一个是FMRADIO_WIDGET_STATE_EXTERNAL_PLAY,一般的FMRADIO_WIDGET_STATE_EXTERNAL_NONE = 0作为默认的event枚举的第一个,是无效的event,在此event枚举中有效的event是FMRADIO_WIDGET_STATE_EXTERNAL_PLAY。

二、event的有效化 
      通过以下方式,主要是函数MMI_FRM_INIT_EVENT,来合法化自己定义的event。 例如如下代码: 
        mmi_event_struct event; //定义event结构体 
       MMI_FRM_INIT_EVENT(&event,  FMRADIO_WIDGET_STATE_EXTERNAL_PLAY);//将自己定义的event初始化到event结构体中,是自己定义的event得到有效化。 

三、event的发送 
      自己定义event的目的就是用来传递,是接受函数做出需要的反应。    
  可以通过以下方式来传递自己的event到指定的接受函数:   
      mmi_frm_post_event((mmi_event_struct*)(&event), Wgui_fmply_widget_event_handler,NULL);//event的发出。将event结构体的地址传给函数Wgui_fmply_widget_event_handler,该函数就是event的接受函数,(可以自己实现)。其中event结构体是第二步中的结构体,该结构体中有自己定义的event。 

或者
    mmi_frm_send_event(mmi_event_struct * evt,mmi_proc_func proc,void * user_data)也可以发送event,
    send和post是event的两种不同的发送方式而已  
     
    所以第二步第三步的代码应该写在一起,如下所示:   
      mmi_event_struct event;  
      MMI_FRM_INIT_EVENT(&event,  FMRADIO_WIDGET_STATE_EXTERNAL_PLAY); 
      mmi_frm_post_event((mmi_event_struct*)(&event), Wgui_fmply_widget_event_handler,NULL);
//或者用函    数mmi_frm_send_event,用哪一个根据实际(需要post还是send)情况决定。 
关键之处就在于:寻找到合适的event发出点,也就是说在哪个地方发出自己需要的event,这是很重要的,否则达不到自己期望的效果。也就是说以下代码 
    mmi_event_struct event;  
   MMI_FRM_INIT_EVENT(&event,  FMRADIO_WIDGET_STATE_EXTERNAL_PLAY); 
   mmi_frm_post_event((mmi_event_struct*)(&event), Wgui_fmply_widget_event_handler,NULL);
  //或者用函数mmi_frm_send_event,用哪一个根据实际(需要post还是send)情况决定。 往哪加很重要。 

四、event的接受 
       第三步中函数Wgui_fmply_widget_event_handler为接收函数,该函数可以自己定义。 
     mmi_ret  Wgui_fmply_widget_event_handler(mmi_event_struct *evt) { switch(evt->evt_id)       
     { 
      case FMRADIO_WIDGET_STATE_EXTERNAL_PLAY:         
       { 
          wgui_widget_fm_button_draw(&button[POWER_BUTTON]);//接收到FMRADIO_WIDGET_STATE_EXTERNAL_PLAY                                                 //之后要做出的动作,该函数也可自己实现         
          break;        
        }      
     default:    
         break;          
     }   
   return MMI_OK;
}











原创粉丝点击