Android StateMachine

状态机

状态机定义

状态机,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的介绍。


原创内容欢迎转载,但请注明出处,谢谢!