Android Framework 状态机实现原理
前言
状态模式是比较一种常见的设计模式,为了解决某个事物很多状态之间的切换很多的业务逻辑,这样可以避免很多if-else嵌套,不仅提高了代码的可读性,同样拓展性也得到很大的提升。在Android系统中,像wifi、蓝牙的源码中,看到状态机的使用,所以来学习下。状态机是对状态模式的一种拓展,使用了Handler机制来对消息的分发,同时还增加了 state-hierarchy 的模式,状态同样也有父状态,如果当前状态没有能力去处理当前消息,会去让父状态来处理。下面会从使用的角度来分析源码,来深入理解Android Framework 状态的机制。
我们使用Android源码中给的例子:
//首先初始化状态机,然后调用start()方法
public static Hsm1 makeHsm1() {
System.out.println("makeHsm1 E");
Hsm1 sm = new Hsm1("hsm1"); //Hsm1 extend StateMachine
sm.start();
System.out.println("makeHsm1 X");
return sm;
}
//状态机的构造方法
Hsm1(String name) {
super(name);
System.out.println("ctor E");
//添加状态,其中mP1是mS1和mS2的父状态,
addState(mP1);
addState(mS1, mP1);
addState(mS2, mP1);
addState(mP2);
// 需要设置一个初始状态
setInitialState(mS1);
System.out.println("ctor X");
}
//调用状态机方法,让状态机运行起来,然后发消息
Hsm1 hsm1 = Hsm1.makeHsm1();
hsm1.sendMessage(hsm1.obtainMessage(Hsm1.CMD_1));
hsm1.sendMessage(hsm1.obtainMessage(Hsm1.CMD_2));
状态机初始化
状态机的初始化是调用了StateMachine.start()方法,看下源码:
public void start() {
// 确保handler创建了
SmHandler smh = mSmHandler;
if (smh == null) return;
/** Send the complete construction message */
smh.completeConstruction();
}
private final void completeConstruction() {
if (mDbg) mSm.log("completeConstruction: E");