状态机
状态机定义
状态机,Finite state machine,简称FSM。指一个对象在有限个状态内转移并处理外部事件的数字模型。
状态机定义如图所示,一个对象有n个状态。假设初始状态为State1,当外部事件到来时,处在状态State1的对象处理这个状态并转移到状态State2,而这个对象在状态State2时接收到外部事件时又会处理这个事件并转移到另外一个状态。
比如,我们通话的声道会有扬声器、耳机、听筒、蓝牙4个状态。假设我们这通通话的声道初始状态为听筒,当用户在通话界面把声道切为扬声器时,听筒这个状态会打开扬声器并转移到扬声器状态。打开扬声器这个动作,我们可以在听筒状态转移到扬声器之前处理,也可以在进入扬声器状态时处理。因此,我们可以有一个扩展的状态机定义:
带enter exit action的状态机这个状态机比上面的状态机每个State多了enter和exit两个action,表示在进入或者退出某个状态时会做的动作,比如上面那个例子中扬声器State的enter action可以打开扬声器而其exit action可以关闭扬声器。如图所示:
AudioRoute状态机分层状态机
分层状态机,Hierarchical Finite State Machine,简称HFSM。即对象的N个有限状态中的某个状态可以有N个子状态。这里不细讲。
状态机模式
状态机模式定义
实现状态机的一种方法就是状态机模式(State Pattern),其定义如下:
状态机模式定义一个状态接口State,在外部事件message到来时,State处理该事件并在其实现类之前转移。其时序图如下:
状态机模式时序图下面我们将通过Android状态机StateMachine来详细讲解这个模式的设计和使用。
Android状态机
设计及实现
Android原生通过状态机模式实现了一个分层状态机名为StateMachine。其结构如下:
Android StateMachine结构一个状态机对象,由一棵状态树,及实现状态转移并接收外部事件给当前状态处理的SmHandler构成。其具体流程的时序图如下:
Android StateMachine时序图1. 构建一棵状态树(可多层)。
2. 设置初始状态。
3. 启动状态机。即,进入初始状态,并完成初始状态的enter action。
4. 状态机收到一个外部事件,并交由SmHandler处理,SmHandler通知当前状态处理事件,如果当前状态处理完这个事件后需要状态转移,则由SmHandler完成状态转移。
5. 退出当前状态时,SmHandler通知当前状态处理exit action。进入新状态之前,SmHandler通知新状态先处理其enter action。
6. SmHandler在通知当前状态处理事件前和状态完成事件处理之后,会回调StateMachine处理准备和结束动作。
使用方法
状态机的使用很简单,如图
Android StateMachine使用只需要建立一个StateMachine的实现类,在这个实现类中创建State的各个实现,通过StateMachine#addState()构建状态树,开启状态机。
其具体流程可参考下图:
Android StateMachine流程应用
具体应用请参考 Android通话应用设计 中关于CalAudioRouteStateMachine和CallAudioModeStateMachine的介绍。
原创内容欢迎转载,但请注明出处,谢谢!
网友评论