MTK屏幕入栈与出栈的管理_第1页
MTK屏幕入栈与出栈的管理_第2页
MTK屏幕入栈与出栈的管理_第3页
MTK屏幕入栈与出栈的管理_第4页
MTK屏幕入栈与出栈的管理_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MTK屏幕入栈与出栈的管理(history管理)一 从idle screen到main menu 屏幕的过程EntryIdleScreen EntryNewScreen(IDLE_SCREEN_ID, ExitIdleScreen, NULL, NULL);这个函数 currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID在运行ExecuteCurrExitHandler_Ext 这个函数时 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; 这几条语句就 mmi_pwron_exit_animation_screen();这个函数了,并没有加上history节点 currExit

3、FuncPtr = ExitIdleScreen currEntryFuncPtr = NULL当点击了一个ok 键的时候调用了goto_main_menu 这个函数 。goto_main_menu 这个函数也同样有EntryNewScreen(MAIN_MENU_SCREENID, exit_main_menu, NULL, NULL); 这个函数注意在执行EntryNewScreen 这条语句前关于屏幕的全局变量的值是这样的: currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID currExitFuncPtr = E

4、xitIdleScreen currEntryFuncPtr = NULL currHistoryIndex = -1 IsBackHistory = FALSE historyData 数组的值全部为空现在进入EntryNewScreen 函数,首先currTopScrnID的值被改变currTopScrnID = MAIN_MENU_SCREENID然后执行ExecuteCurrExitHandler_Ext 这个函数 这时currExitFuncPtr的值为ExitIdleScreen所以当执行到 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; 语句的时候,其实调用的是ExitIdleScreen 这个函数,然后再看一下ExitIdleScreen 这个函数。 GenericExitScreen(IDLE_SCREEN_ID, EntryIdleScreen);这条语句将 history h; h.scrnID = scrnID; h.e

6、ntryFuncPtr = entryFuncPtr; AddHistory(h); 其实最后调用的是 AddHistoryReference 这个函数而这个函数就是向historyData 这个全局数组写入数据的函数。首先判断IsBackHistory 不等于MMI_TRUE,其中IsBackHistory 在程序初始化的时候为0然后执行 increment();该语句改变了currHistoryIndex 的值 使得currHistoryIndex = 0;接着改变了全局变量historyData的值 使得historyData0.scrnID = IDLE_SCREEN_ID histo

7、ryData0.entryFuncPtr = EntryIdleScreen并且给 historyData0.guiBuffer 分配了空间但是这个函数里并没有保存有用的内容。IsBackHistory这个值 在 这个ExecuteCurrExitHandler_Ext的最后一条语句再次保证了其不是MMI_TRUEIsBackHistory = FALSE;当goto_main_menu 的EntryNewScreen 函数执行完ExecuteCurrExitHandler_Ext 这个函数后全局变量的值如下 currTopScrnID = MAIN_MENU_SCREENID currExi

8、tScrnID = IDLE_SCREEN_ID currExitFuncPtr = NULL currEntryFuncPtr = NULL currHistoryIndex = 0 IsBackHistory = FALSE historyData 数组的值现在已经不是全部为空了而是historyData0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空间,但是没有什么有用的内容。继续向下走 接着currExitScrnID的值也被改变了 curr

9、ExitScrnID = MAIN_MENU_SCREENID 接着执行SetGenericExitHandler 这条语句,又更改了两外两个全局变量的值 currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL至此,从idle屏幕到mainmenu 屏幕所修改的全局变量,如下进入idle屏幕的时候,全局变量的值是 currTopScrnID = IDLE_SCREEN_ID currExitScrnID = IDLE_SCREEN_ID currExitFuncPtr = ExitIdleScreen currEntryFuncPtr

10、= NULL currHistoryIndex = -1 IsBackHistory = FALSE historyData 数组的值全部为空进入mainmenu屏幕后 全局变量的值是 currTopScrnID = MAIN_MENU_SCREENID currExitScrnID = MAIN_MENU_SCREENID currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL currHistoryIndex = 0 IsBackHistory = FALSE historyData 数组的值现在已经不是全部为空了而是history

11、Data0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空间,但是没有什么有用的内容。请注意,所谓的屏幕入栈,现在已经很清晰了currHistoryIndex 就是栈丁指针,而historyData 就是所谓的栈空间。二 从mainmenu 这个屏幕返回到idle屏幕的过程。返回的时候调用的是GoBackHistory 这个函数,就跟一下这个函数的执行过程。这个函数关键的是调用了ExecutePopHistory();这个函数。其首先改变了IsBack

12、History这个全局变量的值,其中的原因是能在后面的代码中看到 IsBackHistory = MMI_TRUE;然后执行 if (historyDatacurrHistoryIndex.entryFuncPtr && currHistoryIndex > 0)这个判断,因为我们的屏幕栈中已经有内容了,但是currHistoryIndex 为0 所以没有满足这个条件走的else的代码currHistoryIndex = -1;if (historyData0.entryFuncPtr) 这条语句的条件满足,所以执行(*(historyData0.entryFuncPtr

13、) (); 这条语句。前面已经看到historyData0.entryFuncPtr = EntryIdleScreen 所以上面的这条语句其实解析出来的话就是 EntryIdleScreen();回到idle屏幕的这个函数.这时候全局变量的值再罗列一下 currTopScrnID = MAIN_MENU_SCREENID currExitScrnID = MAIN_MENU_SCREENID currExitFuncPtr = exit_main_menu currEntryFuncPtr = NULL currHistoryIndex = -1 IsBackHistory = 1 hist

14、oryData 数组的值现在已经不是全部为空了而是historyData0.scrnID = IDLE_SCREEN_ID historyData0.entryFuncPtr = EntryIdleScreen historyData0.guiBuffer 分配了空间,但是没有什么有用的内容。虽然historyData0中还是有内容的,但是由于栈顶指针已经改变成 -1 所以,其实已经完成了退栈的过程当又执行一遍EntryIdleScreen 函数中的EntryNewScreen这个函数时currTopScrnID = IDLE_SCREEN_IDExecuteCurrExitHandler_E

15、xt() 函数的执行if(currExitFuncPtr)MMI_TRACE( (MMI_TRACE_G1_FRM, MMI_FRM_INFO_EVENT_EXIT_HDLR);(*currExitFuncPtr)();这条语句时 其实(*currExitFuncPtr)(); 执行的是exit_main_menu() 这个函数.这个函数的AddHistory(main_menu_history); 这条语句,其实调用的还是AddHistoryReference这个函数,但是确没有使historyData的数据发生变化,原因就出在IsBackHistory 这个全局变量上IsBackHistory 这个全局变量,其实是用来保证当使用GoBackHistory 这种函数返回屏幕时,不会压栈,具体可以从if(IsBackHistory != MMI_TRUE) 这行代码看出来.(*currExitFuncPtr)(); 函数执行完以后 currExitFuncPtr = NULL currEntryFuncPtr = NULL IsBackHistory = FALSE;当EntryIdleScreen 函数中的EntryNewScreen函数执行完以后,全局变量的值如下 cu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论