mre应用和Native的交互之消息传递
mre应用和native的新增API接口可以实现mre单方面的调用native的代码,那如何实现native端调用mre里面的接口呢?比如现在来电话了,mre应用里面就对应的有些逻辑要处理,来电话了是native端的实时监控,这时native端怎么调用到mre里面的代码呢?可以通过向mre应用发送消息。
现在以mtk 50_11BW1224_FTE的版本为基础,实现在主菜单进入短信服务时,便启动mre应用test.vxp,然后向其发送MESSAGE_ENTRY消息。test.vxp接收到MESSAGE_ENTRY,然后输出”进入短息服务“到屏幕上。
1、找到\plutommi\mmi\UnifiedMessage\UnifiedMessageSrc\uminterface.c 里面的void mmi_um_entry_main_message_menu(void)函数,这个函数就是进入短信服务界面的入口点了,这里修改mmi_um_entry_main_message_menu成如下,
#include "TimerEvents.h"
#include "vmpromng.h"
#include "Conversions.h"
#include "vmappcomm_sdk.h"
#include "vmio.h"
//自定义消息值
#define MESSAGE_ENTRY 210
static void mmi_send_msg_timer_func(void)
{
U8* filepath = "E:\\mre\\test.vxp";
U16 w_filepath[256] = {0};
S32 mre_app_handle = 0;
mmi_chset_convert(MMI_CHSET_GB2312, MMI_CHSET_UCS2, (U8*)filepath, (U8*)w_filepath, 256);
StopTimer(AVATAR_DELAY_DECODE_0);
mre_app_handle = srv_mre_get_running_handle(w_filepath);
if(mre_app_handle > 0)
{
srv_mre_send_msg(mre_app_handle,MESSAGE_ENTRY, NULL, NULL); //发送消息
}
}
void mmi_um_entry_main_message_menu(void)
{
U8* filepath = "E:\\mre\\test.vxp";//test.vxp的存放路径,这里是放在T卡mre下
U16 w_filepath[256] = {0};
VMFILE fd = 0;
mmi_chset_convert(MMI_CHSET_GB2312, MMI_CHSET_UCS2, (U8*)filepath, (U8*)w_filepath, 256);
fd = vm_file_open(w_filepath, MODE_READ, 0);
vm_file_close(fd);
if(fd >= 0)
{
vm_start_app(w_filepath, GRP_ID_ROOT, 1);//启动vxp
if(mmi_sms_is_new_msg_come())
{
mmi_sms_set_new_msg_come(FALSE);
//启动vxp是用timer启动的,而消息必须在vxp运行
//起来后才能发送,故发消息也用timer延迟
StartTimer(AVATAR_DELAY_DECODE_0, 500, mmi_send_msg_timer_func);
}
return;
}
}
2、mre应用如何接受处理MESSAGE_ENTRY消息首先要在vm_main里面为注册一个消息处理函数,下面的vm_reg_msg_proc(handle_msg);既是将handle_msg这个函数注册成为消息处理函数了。
void vm_main(void) {
/* initialize layer handle */
layer_hdl[0] = -1;
/* register system events handler */
vm_reg_sysevt_callback(handle_sysevt);
/* register keyboard events handler */
vm_reg_keyboard_callback(handle_keyevt);
/* register pen events handler */
vm_reg_pen_callback(handle_penevt);
vm_reg_msg_proc(handle_msg);
/* Init MRE resource */
vm_res_init();
}
消息处理,在handle_msg这个函数中处理消息#define MESSAGE_ENTRY 210,这里需要保证native和mre应用中的两个消息值一致
#define MESSAGE_ENTRY 210
VMINT handle_msg(VM_P_HANDLE sender, VMUINT msg_id, VMINT wparam, VMINT lparam)
{
switch (msg_id)
{
case MESSAGE_ENTRY:
{
VMWCHAR wstr[256] = {0};
vm_gb2312_to_ucs2(wstr, 256, "进入短信服务!");
draw_text(wstr);
break;
}
}
return 0;
}
不积跬步无以至千里,不积小流无以成江河。