MTK屏幕入棧與出棧的管理_第1頁(yè)
MTK屏幕入棧與出棧的管理_第2頁(yè)
MTK屏幕入棧與出棧的管理_第3頁(yè)
MTK屏幕入棧與出棧的管理_第4頁(yè)
MTK屏幕入棧與出棧的管理_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MTK屏幕入棧與出棧的管理(history管理)一 從idle screen到main menu 屏幕的過(guò)程EntryIdleScreen EntryNewScreen(IDLE_SCREEN_ID, ExitIdleScreen, NULL, NULL);這個(gè)函數(shù) currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID在運(yùn)行ExecuteCurrExitHandler_Ext 這個(gè)函數(shù)時(shí) currEntryFuncPtr = mmi_pwron_entry_animation_screen currExitFuncPtr

2、= mmi_pwron_exit_animation_screen if (currExitFuncPtr) MMI_TRACE(MMI_TRACE_G1_FRM, MMI_FRM_INFO_EVENT_EXIT_HDLR); mmu_frm_execute_scrn_exit_handler = MMI_TRUE; (*currExitFuncPtr) (); mmu_frm_execute_scrn_exit_handler = MMI_FALSE; 這幾條語(yǔ)句就 mmi_pwron_exit_animation_screen();這個(gè)函數(shù)了,并沒(méi)有加上history節(jié)點(diǎn) currExit

3、FuncPtr = ExitIdleScreen currEntryFuncPtr = NULL當(dāng)點(diǎn)擊了一個(gè)ok 鍵的時(shí)候調(diào)用了goto_main_menu 這個(gè)函數(shù) 。goto_main_menu 這個(gè)函數(shù)也同樣有EntryNewScreen(MAIN_MENU_SCREENID, exit_main_menu, NULL, NULL); 這個(gè)函數(shù)注意在執(zhí)行EntryNewScreen 這條語(yǔ)句前關(guān)于屏幕的全局變量的值是這樣的: currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID currExitFuncPtr = E

4、xitIdleScreen currEntryFuncPtr = NULL currHistoryIndex = -1 IsBackHistory = FALSE historyData 數(shù)組的值全部為空現(xiàn)在進(jìn)入EntryNewScreen 函數(shù),首先currTopScrnID的值被改變currTopScrnID = MAIN_MENU_SCREENID然后執(zhí)行ExecuteCurrExitHandler_Ext 這個(gè)函數(shù) 這時(shí)currExitFuncPtr的值為ExitIdleScreen所以當(dāng)執(zhí)行到 if (currExitFuncPtr) MMI_TRACE(MMI_TRACE_G1_F

5、RM, MMI_FRM_INFO_EVENT_EXIT_HDLR); mmu_frm_execute_scrn_exit_handler = MMI_TRUE; (*currExitFuncPtr) (); mmu_frm_execute_scrn_exit_handler = MMI_FALSE; 語(yǔ)句的時(shí)候,其實(shí)調(diào)用的是ExitIdleScreen 這個(gè)函數(shù),然后再看一下ExitIdleScreen 這個(gè)函數(shù)。 GenericExitScreen(IDLE_SCREEN_ID, EntryIdleScreen);這條語(yǔ)句將 history h; h.scrnID = scrnID; h.e

6、ntryFuncPtr = entryFuncPtr; AddHistory(h); 其實(shí)最后調(diào)用的是 AddHistoryReference 這個(gè)函數(shù)而這個(gè)函數(shù)就是向historyData 這個(gè)全局?jǐn)?shù)組寫(xiě)入數(shù)據(jù)的函數(shù)。首先判斷IsBackHistory 不等于MMI_TRUE,其中IsBackHistory 在程序初始化的時(shí)候?yàn)?然后執(zhí)行 increment();該語(yǔ)句改變了currHistoryIndex 的值 使得currHistoryIndex = 0;接著改變了全局變量historyData的值 使得historyData0.scrnID = IDLE_SCREEN_ID histo

7、ryData0.entryFuncPtr = EntryIdleScreen并且給 historyData0.guiBuffer 分配了空間但是這個(gè)函數(shù)里并沒(méi)有保存有用的內(nèi)容。IsBackHistory這個(gè)值 在 這個(gè)ExecuteCurrExitHandler_Ext的最后一條語(yǔ)句再次保證了其不是MMI_TRUEIsBackHistory = FALSE;當(dāng)goto_main_menu 的EntryNewScreen 函數(shù)執(zhí)行完ExecuteCurrExitHandler_Ext 這個(gè)函數(shù)后全局變量的值如下 currTopScrnID = MAIN_MENU_SCREENID currExi

8、tScrnID = IDLE_SCREEN_ID currExitFuncPtr = NULL currEntryFuncPtr = NULL currHistoryIndex = 0 IsBackHistory = FALSE historyData 數(shù)組的值現(xiàn)在已經(jīng)不是全部為空了而是historyData0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空間,但是沒(méi)有什么有用的內(nèi)容。繼續(xù)向下走 接著currExitScrnID的值也被改變了 curr

9、ExitScrnID = MAIN_MENU_SCREENID 接著執(zhí)行SetGenericExitHandler 這條語(yǔ)句,又更改了兩外兩個(gè)全局變量的值 currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL至此,從idle屏幕到mainmenu 屏幕所修改的全局變量,如下進(jìn)入idle屏幕的時(shí)候,全局變量的值是 currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID currExitFuncPtr = ExitIdleScreen currEntryFuncPtr

10、= NULL currHistoryIndex = -1 IsBackHistory = FALSE historyData 數(shù)組的值全部為空進(jìn)入mainmenu屏幕后 全局變量的值是 currTopScrnID = MAIN_MENU_SCREENID currExitScrnID = MAIN_MENU_SCREENID currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL currHistoryIndex = 0 IsBackHistory = FALSE historyData 數(shù)組的值現(xiàn)在已經(jīng)不是全部為空了而是history

11、Data0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空間,但是沒(méi)有什么有用的內(nèi)容。請(qǐng)注意,所謂的屏幕入棧,現(xiàn)在已經(jīng)很清晰了currHistoryIndex 就是棧丁指針,而historyData 就是所謂的??臻g。二 從mainmenu 這個(gè)屏幕返回到idle屏幕的過(guò)程。返回的時(shí)候調(diào)用的是GoBackHistory 這個(gè)函數(shù),就跟一下這個(gè)函數(shù)的執(zhí)行過(guò)程。這個(gè)函數(shù)關(guān)鍵的是調(diào)用了ExecutePopHistory();這個(gè)函數(shù)。其首先改變了IsBack

12、History這個(gè)全局變量的值,其中的原因是能在后面的代碼中看到 IsBackHistory = MMI_TRUE;然后執(zhí)行 if (historyDatacurrHistoryIndex.entryFuncPtr && currHistoryIndex > 0)這個(gè)判斷,因?yàn)槲覀兊钠聊粭V幸呀?jīng)有內(nèi)容了,但是currHistoryIndex 為0 所以沒(méi)有滿(mǎn)足這個(gè)條件走的else的代碼currHistoryIndex = -1;if (historyData0.entryFuncPtr) 這條語(yǔ)句的條件滿(mǎn)足,所以執(zhí)行(*(historyData0.entryFuncPtr

13、) (); 這條語(yǔ)句。前面已經(jīng)看到historyData0.entryFuncPtr = EntryIdleScreen 所以上面的這條語(yǔ)句其實(shí)解析出來(lái)的話(huà)就是 EntryIdleScreen();回到idle屏幕的這個(gè)函數(shù).這時(shí)候全局變量的值再羅列一下 currTopScrnID = MAIN_MENU_SCREENID currExitScrnID = MAIN_MENU_SCREENID currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL currHistoryIndex = -1 IsBackHistory = 1 hist

14、oryData 數(shù)組的值現(xiàn)在已經(jīng)不是全部為空了而是historyData0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空間,但是沒(méi)有什么有用的內(nèi)容。雖然historyData0中還是有內(nèi)容的,但是由于棧頂指針已經(jīng)改變成 -1 所以,其實(shí)已經(jīng)完成了退棧的過(guò)程當(dāng)又執(zhí)行一遍EntryIdleScreen 函數(shù)中的EntryNewScreen這個(gè)函數(shù)時(shí)currTopScrnID = IDLE_SCREEN_IDExecuteCurrExitHandler_E

15、xt() 函數(shù)的執(zhí)行if(currExitFuncPtr)MMI_TRACE( (MMI_TRACE_G1_FRM, MMI_FRM_INFO_EVENT_EXIT_HDLR);(*currExitFuncPtr)();這條語(yǔ)句時(shí) 其實(shí)(*currExitFuncPtr)(); 執(zhí)行的是exit_main_menu() 這個(gè)函數(shù).這個(gè)函數(shù)的AddHistory(main_menu_history); 這條語(yǔ)句,其實(shí)調(diào)用的還是AddHistoryReference這個(gè)函數(shù),但是確沒(méi)有使historyData的數(shù)據(jù)發(fā)生變化,原因就出在IsBackHistory 這個(gè)全局變量上IsBackHistory 這個(gè)全局變量,其實(shí)是用來(lái)保證當(dāng)使用GoBackHistory 這種函數(shù)返回屏幕時(shí),不會(huì)壓棧,具體可以從if(IsBackHistory != MMI_TRUE) 這行代碼看出來(lái).(*currExitFuncPtr)(); 函數(shù)執(zhí)行完以后 currExitFuncPtr = NULL currEntryFuncPtr = NULL IsBackHistory = FALSE;當(dāng)EntryIdleScreen 函數(shù)中的EntryNewScreen函數(shù)執(zhí)行完以后,全局變量的值如下 cu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論