熟悉了几个模块的代码流程以后,发现屏幕创建并没有想像中的简单,每个程序似乎都要在创建自己的屏幕之前先创建一个群,随后又进入这个群后,这才开始自己屏幕的创建,为什么要这么多此一举呢,为了研究屏幕的运作流程?我用MODIS追踪了屏幕的创建过程。
首先,介绍下两个根节点,一个是屏幕根节点ROOT,所有的有效屏幕都是它的子孙节点,还一个是scenario_dangle,用来暂存刚创建或马上要销毁的屏幕节点。
然后屏幕节点分为group节点和screen节点。group节点用来管理它旗下的screen节点,它本身并不产生实际意义上的屏幕,screen节点可以理解为我们所见到的屏幕。其中ROOT下面的叶子节点必须得是screen节点。如图1所示,其中,ROOT节点下面的8101节点是开机最早创建的一个group节点,它旗下有四个screen节点,其中8105节点就是选择sim卡的界面,而8108则是选择sim卡进入待机界面前的动画绘制界面,8102节点比较奇怪,它本身好像没什么效果,不知道是不是为了保证叶子节点是screen节点才创建的。
group节点和screen节点的创建过程也不太一样,我简要概括一下两者的创建和销毁流程:
1.group节点:
典型的函数: mmi_frm_group_create mmi_frm_group_enter mmi_frm_group_close
(1) 创建节点:
a. 检查scenario_dangle中是否存在此id
b. 检查parent节点中是否存在此id
c. 若没有,则创建节点(分配内存)并赋予parent的id(但parent中未加入此节点)
d. add_node(scenario_dangle, new_node): 将节点插到scenario_dangle的tail中,以我跟踪的情况,每次都是在图1中1327号节点的右边
(2) 移动节点
a. 从scenario_dangle中获取此id