MTK HISTROY 小结 3

在  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 函数,也是莫名其妙,不知道为什么要单独搞,要模块化,也太随意了。。。让我想到我们公司现在状态了,为了赶项目,代码都没法看了,没法理解了。。。。

 

时间过得很快,本来还想分析 GoBackHistory,看来只能明天了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值