在上两偏里,主要讲了进入一个app是需要用到的一个函数 EntryNewScreen,今天就说一下主动退出一个应用需要使用的函数 GoBackHistory,这个函数的作用就是退出当前app,回到上一个app。 在 GoBackHistory 这个函数里,没有什么内容,主要是 一个执行一个函数 ExecutePopHistory(),还有就是设置了 mmi_is_orderly_exit_screen = MMI_FALSE; 对于这个变量,也是一种特殊用法,只有当使用GoBackToHistory切换到指定 app 时才有效(这里说的app,也可以是一个模块入口或者界面的入口)。
static void ExecutePopHistory(void) { //IsBackHistory 这变量表示 正在处理gobackhistroy,在 MTK HISTROY 小结 3 里就批评了这个 全局变量 //这么搞一个全局变量,很让人头疼,不是static的. 在 AddHistory 里面起到保护 historyData的作用,怕这个数据被重入.就是当gobackhistory时,会又entryNewScreen,又会AddHistory. 有点绕。 IsBackHistory = MMI_TRUE; // CheckMainLCDHistoryBack = MMI_TRUE; //又是一个全局变量,比 IsBackHistory 好一点,至少搞成static的了, bBackHistoryFlag = MMI_TRUE; // 判断是否有入口函数和是否不是最后一个历史记录(除了idle 的 currHistoryIndex 0) // 这个写法是否有bug? // 如果 currHistoryIndex 刚好为 -1 而 historyData[currHistoryIndex] == NULL,那就crash了 // 至少应该这么写 if (currHistoryIndex > 0 && historyData[currHistoryIndex].entryFuncPtr ) if (historyData[currHistoryIndex].entryFuncPtr && currHistoryIndex > 0) { U16 id; // 执行 当前active app 的注册的 del 函数 ExecTopScrnCallbackHandler(); id = historyData[currHistoryIndex].scrnID; { //执行入历史记录的口函数 if (historyData[currHistoryIndex].entryFuncPtr) { (*(historyData[currHistoryIndex].entryFuncPtr)) (); } if (id == historyData[currHistoryIndex].scrnID) { // 删除历史记录 decrement(); } } } else { ExecTopScrnCallbackHandler(); //进入到idle currHistoryIndex = -1; if ((historyData[0].entryFuncPtr)) { (*(historyData[0].entryFuncPtr)) (); } //表示已经释放过,防止重复释放 if (bDinitHistoryFlag) { bDinitHistoryFlag = MMI_FALSE; } else { mmi_free_history_buffer(0); memset(&historyData[0], 0, sizeof(historyNode)); } IsBackHistory = MMI_FALSE; } CheckMainLCDHistoryBack = MMI_FALSE; bBackHistoryFlag = MMI_FALSE; }