MTK - 10A帮助文档(总结) 联系客服

发布时间 : 星期六 文章MTK - 10A帮助文档(总结)更新完毕开始阅读c34cff96daef5ef7ba0d3cc1

MTK 10A帮助文档

一.10A MMI主要新特征

1. 新Event机制 API:

#define MMI_FRM_SEND_EVENT(_evt, _proc, _user_data) \\ mmi_frm_send_event((mmi_event_struct *)(_evt), (mmi_proc_func)(_proc), (void *)(_user_data))

#define MMI_FRM_POST_EVENT(_evt, _proc, _user_data) \\

mmi_frm_post_event((mmi_event_struct *)(_evt), (mmi_proc_func)(_proc), (void *)(_user_data))

mmi_frm_send_event = 直接函数调用

mmi_frm_post_event 发消息稍后调用(据MTK说是为了防止循环调用)

mmi_frm_invoke_post_event可以处理队列里的消息,这个mtk已经做好了在一些必要的地方调用

Event处理机制在MTK 10A mmi framework代码中很重要,在后续特征中会有体现

2. Callback管理机制

10A中callback其实还是用event机制实现的

在mmi_cb_mgr_cfg.h中可以看到如何注册一个event的callback,也可以通过调用mmi_ret mmi_frm_cb_reg_event(U16 evt_id, mmi_proc_func call_back, void *user_data)来注册,一个event可以注册多个callback,会依次调用,如果有需要截断后面的处理,则不能返回MMI_RET_OK

MTK新版本中已有的event数量已经非常多,也可以自己添加,需要在以后熟悉代码中慢慢熟悉已有的event的意义

此时的callback event和上面1中的event有些区别的,使用mmi_frm_cb_emit_post_event来发送,在mmi_frm_invoke_post_event中会判断然后和1中的event区别处理

3. Screen Group机制 见图形化文档

跟原来的screen机制并不能完全兼容,如需移植代码需要注意,独立的功能最好添加一个group id,否则可以使用已有的group id

4. CUI Common UI

5. 添加XML 方式描述Mmi Resource

1

可见代码:phonebook.res MTK会解析*.res文件生成mmi_rp_{APP_NAME}_def.h 兼容以前的添加资源方式

6. 新按键处理

static void process_key_event_routing(mmi_frm_key_evt_struct *key_evt_p) 参考PRST_FRM_NewInputHandler.pdf

7. 新屏幕刷新机制

MTK为了避免屏幕闪的问题,改在特定的时间刷新屏幕,如果需要马上刷新需要设置

mmi_frm_set_curr_scr_blt_mode(MMI_FRM_SCR_BLT_IMMEDIATE);(有些需要频繁刷新屏幕的应用需要)

8. 怎样添加一个新应用

见文档 PRST_FRM_HOW_TO_WRITE_APP_10A.pdf

二.MTK History机制深入分析

1.10A的屏幕架构

10A中的屏幕管理,不再像以前那样简单的管理一个数组,出栈入栈,而是维护一个树,如下图:

Group headtailGroup nextGroup nextGroup head\\tailheadtailheadtailScreeen Screeen nextGroup Screeen nextGroup head\\tailheadtailnextScreeen Screeen Screeen 这个是总的屏幕集合的一部分,基本上是主菜单一个应用有自己的一个总的group(也不排除特殊情况,比如设置菜单),在这个group下有许多子group(就好像一个菜单中有很多子菜单),子group中又会有用来显示的screen以及其它的group,依次类推,不过最底部(叶子节点)一定会是个screen,用作显示。 以前的EntryNewScreen是一个入栈的过程,现在的进入新屏,就需要创建新的group连接到已有的父group的子group中的尾部,然后再以新建的group为父

2

节点创建screen用作显示,当然这其中也会处理前一个group,也就是保存历史的操作。

进屏之后返屏,可以想象返屏就会移除父group的子group中的tail的group并释放在其申请的内存,接着激活其前一个节点(可能是group,可能是screen),tail的group就会是激活的节点。 具体的进\\出屏幕会在下文详细介绍。

2.进屏流程

由于10A中也会用到原来的EntryNewScreen进屏,也会有直接创建screen进屏等多种方式进屏,我在这就只列出一个比较具有象征性的进屏方式。因为现在进屏比较复杂我就大体例举其调用的主要的几个函数以及他的作用。

1) mmi_frm_group_create (MMI_ID parent_id, MMI_ID group_id, mmi_proc_func proc, void *user_data),看到这个我想都会知道是创建一个group,它的父ID,ID等系列属性也会根据参数来赋值,值得一提的是group是动态申请内存的方式创建,还有在创建的时候,不会把新节点加到父节点的子节点的尾部。而是先加到shell.scenario_dangle这个节点下。 2) 创建好group后,就会进入group,mmi_frm_group_enter (MMI_ID group_id, mmi_group_enter_flag flag)进入新的group,注意在这里他又会调用add_node这个函数把group加入到他的父级group下,加到尾部,同时会用remove_node()这个函数来remove掉shell.scenario_dangle下对应节点,(有点没懂为什么在新建的时候会add到shell.scenario_dangle这个节点后,又在紧跟着的entry group中remove掉这个节点,是为了防止在第一次creategroup之后没有调用entry gourp么?期待高手解答)这步就是加链表的操作了。

3)接着就是用这个函数group_active(group_node_struct *node, mmi_scenario_evt_struct* evt),这个函数会对该node的父级group做判断:

只有在父级group为shell.scenario_root,才会调用mmi_frm_entry_new_screen(),这个又是我们熟知的进屏函数了,我不再这一一介绍,只说一些不同的操作,他不单利用historyData这个结构体来保

3

存上一个屏幕的信息,也会记录新进的屏幕的信息,还有在记录上一个屏幕信息的时候不再用mmi_frm_add_history这个函数来申请内存保存上一个屏幕控件的历史信息。

接着会inactive其前一个节点。调用group_inactive或者scrn_inactive。

4) group_inactive会调用scrn_inactive来inactive其节点下的(包括本身节点)节点。那么得分析下scrn_inactive,这里会调用该node所记录的退出函数,根据进入函数来调用scrn_add_history(scrn_node_struct *node)来保存历史,这个改良了53的保存控件历史的函数,它统一了各个所有控件的保存方式,不再是像以前那样对特殊模板独立保存方式。这里同样会申请内存来保存控件信息,不过它会根据控件的size大小来申请内存,而且都是保存在node这个结构体中,同样也可以在退出函数中作保存历史的操作。

5) 以上几步是把上个屏幕的信息保存下来了,现在要做的是对新的group的操作了。现在要做的就是对新group的操作。这个就要关注下post_scenario_evt(MMI_ID group_id, U32 scrn_id, post_scenario_act_enum act, mmi_scenario_evt_struct *evt, U32 type)这个函数会把参数中的写到post_queue这个结构体队列中,然后调用scenario_process_post_evt_ex(U32 type)来读取队列执行相应写入的操作,比如激活新group就会调用group_post_active(group_node_struct *node, mmi_scenario_evt_struct* evt)这个函数用shell.active_group来记录进入的新node。shell.active_scrn为NULL。

6) 仅仅只有好像只是group的操作,那么screen的操作去哪了呢?现在就是开始screen的步骤了,和group一样也会新建screen,同样也是申请内存,把screen加到新的group下,调用scrn_active激活screen,用shell.active_scrn记录新的screen。这里主要还是介绍下两种进屏幕的方式mmi_frm_scrn_first_enter和mmi_frm_scrn_enter,这两者的区别就在于前者可以应用显示函数中应用参数(一般都是节点结构体中记录的数据)还有tab页的进入调用mmi_frm_scrn_tab_enter,和scrn一样最终页调用scrn_node_enter,具体流程类似。(可以看一下mmi_phb_entry_op_option) 具体流程入下图所示(这只是一个比较标准的进屏,10A中也有直接申请Sreen进的,还有用原始的进屏方式等等)

4