private final void completeConstruction() {
int maxDepth = 0;
for (StateInfo si : mStateInfo.values()) {
int depth = 0;
for (StateInfo i = si; i != null; depth++) {
i = i.parentStateInfo;
if (maxDepth < depth) {
maxDepth = depth;
mStateStack = new StateInfo[maxDepth];
mTempStateStack = new StateInfo[maxDepth];
setupInitialStateStack();
sendMessageAtFrontOfQueue(obtainMessage(SM_INIT_CMD, mSmHandlerObj));
private final void setupInitialStateStack() {
StateInfo curStateInfo = mStateInfo.get(mInitialState);
for (mTempStateStackCount = 0; curStateInfo != null; mTempStateStackCount++) {
mTempStateStack[mTempStateStackCount] = curStateInfo;
curStateInfo = curStateInfo.parentStateInfo;
mStateStackTopIndex = -1;
moveTempStateStackToStateStack();
private final int moveTempStateStackToStateStack() {
int startingIndex = mStateStackTopIndex + 1;
int i = mTempStateStackCount - 1;
int j = startingIndex;
while (i >= 0) {
if (mDbg) mSm.log("moveTempStackToStateStack: i=" + i + ",j=" + j);
mStateStack[j] = mTempStateStack[i];
j += 1;
i -= 1;
mStateStackTopIndex = j - 1;
if (mDbg) {
mSm.log("moveTempStackToStateStack: X mStateStackTop=" + mStateStackTopIndex
+ ",startingIndex=" + startingIndex + ",Top="
+ mStateStack[mStateStackTopIndex].state.getName());
return startingIndex;
在初始化完成后,StateMachine就运行起来了,此时只需要按照需求进行对应方法调用即可;
前面提到,StateMachine主要是处理状态切换、消息通知两个方法,前者通过transitionTo实现,后者通过sendMessage及其类似方法完成,并调用SmHandler的对应方法通知到SmHandler中;
而作为Handler的一个子类,SmHandler处理消息是在handleMessage方法中: