Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1070026
  • 博文数量: 169
  • 博客积分: 12306
  • 博客等级: 上将
  • 技术积分: 1299
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-29 14:55
文章分类

全部博文(169)

文章存档

2012年(18)

2011年(78)

2010年(15)

2009年(1)

2008年(11)

2007年(39)

2006年(7)

我的朋友

分类: LINUX

2012-03-09 17:07:08

1.Hierarchical State Machine pattern原理。
 
2.android.os.HandlerStateMachine(android 2.0中提供)
com.android.internal.util.HierarchicalStateMachine(android 2.2.1 froyo中提供)
的简化版。
HierarchicalStateMachine源代码参照:
http://blog.chinaunix.net/space.php?uid=17151843&do=blog&id=142162
 

3. HierarchicalStateMachine是一个机器,这个机器是含有状态的机器,
机器的每个状态都可以有父状态,如果当前状态需要父状态作处理, 那么让该状态的processMessage返回false

4. 当前状态和它的父状态们放在mStateStack数组中, active是用来记录StateInfo包含的state是否是active,在后面计算当前状态和目标状态的共同父状态 过程中使用。
所有状态和状态的StateInfo的键值对存放在HashMap mStateInfo中。
/** The map of all of the states in the state machine */
        private HashMap mStateInfo =
            new HashMap();
/** Stack used to manage the current hierarchy of states */
        private StateInfo mStateStack[ ] ;

5. 转换状态:performTransitions()
a. 寻找当前状态和目标状态的共同父状态,从目标状态开始循环查询父状态的active是否是true,如果是active,说明是当前状态和目标状态的父状态,并依次放入数组mTempStateStack中。
b. 从当前状态到共同父状态(不包括本身)依次调用exit,并将active设置为false,将mStateStackTopIndex设置成mStateStack数组的个数。
c. 反序将mTempStateStack中的元素拷贝到mStateStack中,并重新设置mStateStackTopIndex,并返回第一个需要调用enter的state的 index startingIndex
d. 从共同父状态到目标状态依次调用enter
e. 移动ArrayLiist mDeferredMessages中的deffered message, 从尾部开始将message加入到MessageQueue中的第一个,这样,最先加入mDeferredMessages中的Message第一个得到 执行。并且deffered message比普通Message先执行。


原文地址:http://blog.csdn.net/xiaoxiaosunzhao/article/details/6407827

阅读(777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~