版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年甘肃电器科学研究院聘用人员招聘备考题库完整答案详解
- 2025年齐齐哈尔市总工会工会社会工作者招聘39人笔试重点题库及答案解析
- 2025广东东莞市公安局沙田分局招聘警务辅助人员11人(第8期)考试重点试题及答案解析
- 2025四川德阳市广安发展工程建设有限公司第二批项目合同制员工招聘补充说明笔试重点题库及答案解析
- 2025年金华永康市科学技术局工作人员招聘1人备考笔试试题及答案解析
- 2026年昆明卫生职业学院春季学期教师招聘(4人)备考核心题库及答案解析
- 《CB 3670-1994中国船舶工业总公司企事业单位名称代码》专题研究报告
- 2025中国科学院认知科学与心理健康全国重点实验室博士后及研究助理招聘2人笔试重点题库及答案解析
- 2025湖北随州市中心医院卫生专业技术人员专项招聘21人考试重点题库及答案解析
- 2025中国瑞林工程技术股份有限公司市场化选聘法务总监1人笔试重点题库及答案解析
- 传播学研究方法 课件全套 ch1-导论-传播学研究方法的发展历程 -ch18-大数据的分析与可视化-用图表勾勒网络关系
- MT/T 1218-2024煤矿动压巷道水力压裂切顶卸压施工技术规范
- 中医推拿知识培训课件
- 沃柑种植合同协议书
- 河南省许昌市2024-2025学年八年级上学期数学期末测评卷(含答案与解析)
- 2024-2025学年四川省成都市高一上学期期末教学质量监测英语试题(解析版)
- 人生中的转折点主题班会
- 陈景润数学家人物介绍
- 【浙教版】一年级上册《劳动》《水培植物我养护》
- 2024秋期国家开放大学本科《国际经济法》一平台在线形考(形考任务1至4)试题及答案
- 医学伦理学(山东中医药大学)智慧树知到答案2024年山东中医药大学
评论
0/150
提交评论