MTK HISTROY 小结 2

在  MTK HISTROY 小结 2 介绍了下,当进入一个新的app的时候,MTK 的history 机制 都干了些什么。

1 先把当前app屏幕信息保存到历史history stack 里面

2 回调当前app设置的退出函数,告知app已经被退出

3 清理按键和触摸屏event 和 相应的处理函数。这里需要注意的是对END KEY 进行了特殊处理。

4 设置当前active app 为新app。

说明一点,这里用app之间的切换来说明,其实这套history 机制,可以很灵活的使用,自己app模块之间可以使用,或者更通俗一点只要是 屏幕 切换了,都是可以使用的。

补充一下 保存history信息的过程函数 GenericExitScreen

// scrnID 要保存的 界面id // 当该界面被弹出history时,需要进入的函数 void GenericExitScreen(U16 scrnID, FuncPtr entryFuncPtr) {     //     history h;     U16 nHistory = 0;         h.scrnID = scrnID;     h.entryFuncPtr = entryFuncPtr;     // inputBuffer 保存当前编辑框 text 里的内容,比如说短信编辑时,来电话,返回时需要重新显示编辑内容     // 这里用法很奇怪,就是copy 了一个空串("")过去,却要这么写,不能理解作者意图。。     mmi_ucs2cpy((S8*) h.inputBuffer, (S8*) & nHistory);     // guiBuffer 用于保存当前界面的一些状态信息。比如当前选中的item等等。     // guiBuffer 就是一块内存,但前界面可以把它转化为任何结构体,保存信息。     // 这里是通过 这个函数指针得到需要保存的内容     GetCategoryHistory(h.guiBuffer);     //增加到 history stack 里。     AddHistory(h);     }  // #define AddHistory AddHistoryReference // 所以实际就是下面函数 void AddHistoryReference(history *addHistory) {       S32 length = 0;     // 判断是否是 后退 状态,如果是后退,就不保存。     // 一般后退就是调用 GoBackHistory     if (IsBackHistory != MMI_TRUE)     {         // 增加 history stack 的高度         increment();         // 清空 top stack         memset(&historyData[currHistoryIndex], 0, sizeof(historyNode));         // historyData 就是 history stack         // 保存相应的信息,这里就不再重复了         historyData[currHistoryIndex].scrnID = addHistory->scrnID;         historyData[currHistoryIndex].entryFuncPtr = addHistory->entryFuncPtr;         length = mmi_ucs2strlen((PS8) addHistory->inputBuffer);         if (length)         {             historyData[currHistoryIndex].inputBuffer = OslMalloc(length * ENCODING_LENGTH + ENCODING_LENGTH);             mmi_ucs2cpy((PS8) historyData[currHistoryIndex].inputBuffer, (PS8) addHistory->inputBuffer);         }         historyData[currHistoryIndex].guiBuffer = OslMalloc(MAX_GUI_BUFFER);         memcpy(historyData[currHistoryIndex].guiBuffer, addHistory->guiBuffer, MAX_GUI_BUFFER);     }      IsBackHistory = MMI_FALSE; }


ps:看MTK的代码是在是很乱,全局变量满天飞,这些变量可能就是为了修复某一个bug而用的,很有可能是临时方案(为了干工期,没有时间重构),后来就越来越多,越来越难重构,这完全破坏了程序的可维护性和健壮性,就像上面 AddHistory 里面竟然还有判断是否要保存,这个函数的本意就应该算是保存,可现在搞得也不知道到底有没有保存上,还得看这个全局变量,也不知道什么时候被设置成什么了,糟糕的代码。猜测99%可能,原来设计AddHistory 里面没有 IsBackHistory 这个全局变量,后来为了屏蔽bug,临时搞了一个,就一直留到现在。 还有那个 increment 函数,也是莫名其妙,不知道为什么要单独搞,要模块化,也太随意了。。。让我想到我们公司现在状态了,为了赶项目,代码都没法看了,没法理解了。。。。

 转自:http://blog.csdn.net/yanwuxufeng/archive/2010/08/18/5822642.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值