到这里其实主要history 机制主要得功能都基本ok了,其他的好多接口函数都是换汤不换药,主要就是删除history stack 里面的记录,怎么回调需要被删除的screen 的call back,具体就不说了。
GoBacknHistory 返回到前n个screen id,这个函数有时候还是比较有用,比如当写一个公用模块,处理完毕后,直接返回到调用的地方,这样就不用在意到底是哪个模块调用的,要回到哪里。当然用其他方法来实现,比如保存调用该模块前的screen id等等,但是没有这个函数来的方便,轻巧。
GetCurrScrnId 获得当前history stack 顶部的screen id。注意和 GetActiveScreenId 函数区分, 这个函数是当前获得screen id,获得的screen id 不是history stack。从MTK 的命名上,容易让人混淆。
IsScreenPresent 判断一个screen id 是否存在历史记录里。DeleteScreenIfPresent 如果存在那么删除
操作history的函数还是挺多的,用起来很灵活,但是大部分不常用,如果要做一个比较好的应用,那么基本上也就是app 切换的时候,会用到这些,app 内部的ui 树或者菜单树的跳转,应该不会用这个。
对了还有一个函数要注意:SetDelScrnIDCallbackHandler 这个函数是设置一个回调函数,当这个screen id 被删除的时候,这个回调函数会被调用。当一个应用退出时,需要释放资源的话,最好设置这个函数,不然容易资源泄露,比如在 app 运行时,来了一个短信,然后选择了进入了短信查看,这个时候忽然一键退出,退出到idle,这样就需要在被删除时释放资源。当然也可以在退出函数里释放资源,但是这样做,有可能需要做比较多的状态保存,来回恢复,比较花费时间。比如阅读电子数时,来个闹铃,这个时候,如果在退出应用里做释放资源,那么就需要做很多状态保存。而闹铃很有可能就是简单的关闭,又回到电子书,这个时候,又要恢复状态,比较费劲。这个时候,如果在退出函数里,不做什么,回来时只要刷新下屏幕就一切ok了,好吧,具体的可能还要复杂些。反正我觉得这是一个不错的选择。(也不知道打了一堆字,有没有说清楚)
对于history 机制,还想说明的是一个变量 IsBackHistory,这个变量在前面几篇里也一直提到,可能说得不是很清楚。这个变量的作用其实是表明是否是历史记录返回的。这样在执行 EntryNewScreen 时判断是否要保存历史记录了。
比如 从A->B,这是正常进入,B会调用 EntryNewScreen,把A放入历史记录(这时 IsBackHistory 为false)。然后再B->C,同样B放入历史记录。这个时候从C->B。会弹出B,并且调用B的 EntryNewScreen,(这个时候IsBackHistory 为 true)虽然B从A进入还是从C回退都调用了 EntryNewScreen 但是从C回退时 只会执行C退出函数,而不会产生C的历史记录。
不知道说明白没,这样说吧,EntryNewScreen 会在两种情况下被调用,1,主动进入,产生前一应用的history。2,回退回来,但是不产生回退前应用的history。IsBackHistory 就是判断 EntryNewScreen 是否要产生history。
转自:http://blog.csdn.net/yanwuxufeng/archive/2010/08/30/5851642.aspx