EntryNewScreen(XXX_SCREEN_ID, exit_fun, entry_fun, 0)后,XXX_SCREEN_ID成为Active Screen Id, 但是XXX_SCREEN_ID的信息并不会加入到历史记录中,而是保存在一组全局变量中。只有当新的screen成为active screen时,XXX_SCREEN_ID才会被加入到history中。 我最近在做信息上下一条切换的功能,我的做法是先删除当前的Screen,然后再重新进入,发现DeleteScreenIfPresent一直没有删除当前屏幕,导致要按两次返回键才能退出信息查看界面。 那是不是DeleteScreenIfPresent有问题?DeleteScreenIfPresent会调用searched_history_node来判断Screen是否Present,searched_history_node的代码如下: static S16 searched_history_node(S16 first_index, U16 scrn_id) { while (first_index >= 0) { if (historyData[first_index].scrnID == scrn_id) { break; } --first_index; } return first_index; } OK,searched_history_node只是到historyData数组中去找scrnID。由于EntryNewScreen并没有将active screen的信息保存到historyData中,自然找不到,也就无法删除它。 你一定要删除XXX_SCREEN_ID屏幕,咋办?办法是让XXX_SCREEN_ID先加入到historyData中,也就让XXX_SCREEN_ID不再是active screen。在调用DeleteScreenIfPresent前先进入GLOBAL_SCR_DUMMY就好: void goto_next_msg() { ... EntryNewScreen(GLOBAL_SCR_DUMMY, NULL, NULL, NULL); DeleteScreenIfPresent(XXX_SCREEN_ID); ... } Bingo, 一个Bug解决了。一定有很多人遭遇过同样的问题,所以MTK搞了个GLOBAL_SCR_DUMMY。以前看到这句我还觉得奇怪。都怪付贵的教程不好,呵呵,开玩笑啦。还是侯捷说得好,“源码之前,了无秘密”。