转自 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;
}