在 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