Android Framwork中使用StatMachine都是通过继承StatMachine类实现的,StatMachine类的构造方法如下:
//frameworks/base/core/java/com/android/internal/util/StateMachine.java
public class StateMachine {
protected StateMachine(String name) {
mSmThread = new HandlerThread(name);
mSmThread.start();
Looper looper = mSmThread.getLooper();
initStateMachine(name, looper);
}
}
StateMachine构造方法中创建一个HandlerThread,然后开始这个Thread。
追后调用initStateMachine方法:
//frameworks/base/core/java/com/android/internal/util/StateMachine.java
public class StateMachine {
private void initStateMachine(String name, Looper looper) {
mName = name;
mSmHandler = new SmHandler(looper, this); //创建SmHandler对象
}
}
创建SmHandler对象,SmHandler的构造方法如下:
//frameworks/base/core/java/com/android/internal/util/StateMachine.java
public class StateMachine {
private static class SmHandler extends Handler {
/** true if StateMachine has quit */
private boolean mHasQuit = false;
/** The debug flag */
private boolean mDbg = false;
/** The SmHandler object, identifies that message is internal */
private static final Object mSmHandlerObj = new Object();
/** The current message */
private Message mMsg;
/** A list of log records including messages this state machine has processed */
private LogRecords mLogRecords = new LogRecords();
/** true if construction of the state machine has not been completed */
private boolean mIsConstructionCompleted;
/** Stack used to manage the current hierarchy of states */
private StateInfo mStateStack[];
/** Top of mStateStack */
private int mStateStackTopIndex = -1;
/** A temporary stack used to manage the state stack */
private StateInfo mTempStateStack[];
/** The top of the mTempStateStack */
private int mTempStateStackCount;
/** State used when state machine is halted */
private HaltingState mHaltingState = new HaltingState();
/** State used when state machine is quitting */
private QuittingState mQuittingState = new QuittingState();
/** Reference to the StateMachine */
private StateMachine mSm;
/** The map of all of the states in the state machine */
private HashMap<State, StateInfo> mStateInfo = new HashMap<State, StateInfo>();
/** The initial state that will process the first message */
private State mInitialState;
/** The destination state when transitionTo has been invoked */
private State mDestState;
/**
* Indicates if a transition is in progress
*
* This will be true for all calls of State.exit and all calls of State.enter except for the
* last enter call for the current destination state.
*/
private boolean mTransitionInProgress = false;
/** The list of deferred messages */
private ArrayList<Message> mDeferredMessages = new ArrayList<Message>();
private SmHandler(Looper looper, StateMachine sm) {
super(looper);
mSm = sm;
addState(mHaltingState, null); //将mHaltingState加入到状态机,parent为null
addState(mQuittingState, null); //将mQuittingState加入到状态机,parent为null
}
}
}
SmHandler类中有许多变量,其中包括创建的mHaltingState和mQuittingState类对象,在SmHandler的构造方法中,调用addState方法将mHaltingState和mQuittingState加入到状态机中: