狀態機解析

輸出:


processMsg: Controller$DefaultState
ApStaDisabledState-->enter()
狀態棧中存在2個狀態分別爲
msg = 1
0  DefaultState      state=Controller$DefaultState,parent=null
1  ApStaDisabledState      state=Controller$ApStaDisabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$ApStaDisabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$ApStaDisabledState
ApStaDisabledState-->exit() 
StaEnabledState -->enter()
狀態棧中存在2個狀態分別爲
msg = 2
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$StaEnabledState
DeviceActiveState -->enter()
狀態棧中存在3個狀態分別爲
msg = 3
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceActiveState      state=Controller$DeviceActiveState,parent=Controller$StaEnabledState
=============================================
processMsg: Controller$DeviceActiveState
processMsg: Controller$StaEnabledState
invokeExitMethods: Controller$DeviceActiveState
DeviceActiveState -->exit() 
DeviceInactiveState -->enter()
狀態棧中存在3個狀態分別爲
msg = 4
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceInactiveState      state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
=============================================
processMsg: Controller$DeviceInactiveState
ScanOnlyLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 5
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceInactiveState      state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3  ScanOnlyLockHeldState      state=Controller$ScanOnlyLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$ScanOnlyLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$ScanOnlyLockHeldState
ScanOnlyLockHeldState -->exit() 
FullLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 6
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceInactiveState      state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3  FullLockHeldState      state=Controller$FullLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$FullLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$FullLockHeldState
FullLockHeldState -->exit() 
FullHighPerfLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 7
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceInactiveState      state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3  FullHighPerfLockHeldState      state=Controller$FullHighPerfLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$FullHighPerfLockHeldState
processMsg: Controller$DeviceInactiveState
invokeExitMethods: Controller$FullHighPerfLockHeldState
FullHighPerfLockHeldState -->exit() 
NoLockHeldState -->enter()
狀態棧中存在4個狀態分別爲
msg = 8
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaEnabledState      state=Controller$StaEnabledState,parent=Controller$DefaultState
2  DeviceInactiveState      state=Controller$DeviceInactiveState,parent=Controller$StaEnabledState
3  NoLockHeldState      state=Controller$NoLockHeldState,parent=Controller$DeviceInactiveState
=============================================
processMsg: Controller$NoLockHeldState
processMsg: Controller$DeviceInactiveState
processMsg: Controller$StaEnabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$NoLockHeldState
NoLockHeldState -->exit() 
invokeExitMethods: Controller$DeviceInactiveState
DeviceInactiveState -->exit() 
invokeExitMethods: Controller$StaEnabledState
StaEnabledState -->exit() 
StaDisabledWithScanState -->enter()
狀態棧中存在2個狀態分別爲
msg = 9
0  DefaultState      state=Controller$DefaultState,parent=null
1  StaDisabledWithScanState      state=Controller$StaDisabledWithScanState,parent=Controller$DefaultState
=============================================
processMsg: Controller$StaDisabledWithScanState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$StaDisabledWithScanState
StaDisabledWithScanState -->exit() 
ApEnabledState -->enter()
狀態棧中存在2個狀態分別爲
msg = 10
0  DefaultState      state=Controller$DefaultState,parent=null
1  ApEnabledState      state=Controller$ApEnabledState,parent=Controller$DefaultState
=============================================
processMsg: Controller$ApEnabledState
processMsg: Controller$DefaultState
invokeExitMethods: Controller$ApEnabledState
ApEnabledState -->exit() 
EcmState -->enter()
狀態棧中存在2個狀態分別爲
msg = 11
0  DefaultState      state=Controller$DefaultState,parent=null
1  EcmState      state=Controller$EcmState,parent=Controller$DefaultState
=============================================
processMsg: Controller$EcmState
processMsg: Controller$DefaultState
狀態棧中存在2個狀態分別爲
msg = 12
0  DefaultState      state=Controller$DefaultState,parent=null
1  EcmState      state=Controller$EcmState,parent=Controller$DefaultState
=============================================



public class State {

	public void enter() {
		// donothing
	}

	public void exit() {
		// donothing
	}

	protected State() {
	}

	public boolean processMessage(int msg) {
		return false;
	}

	
	public String getName() {
		return this.getClass().getName();
	}
}
/*
 * 
 addState(mDefaultState);
    addState(mApStaDisabledState, mDefaultState);
    addState(mStaEnabledState, mDefaultState);
        addState(mDeviceActiveState, mStaEnabledState);
        addState(mDeviceInactiveState, mStaEnabledState);
            addState(mScanOnlyLockHeldState, mDeviceInactiveState);
            addState(mFullLockHeldState, mDeviceInactiveState);
            addState(mFullHighPerfLockHeldState, mDeviceInactiveState);
            addState(mNoLockHeldState, mDeviceInactiveState);
    addState(mStaDisabledWithScanState, mDefaultState);
    addState(mApEnabledState, mDefaultState);
    addState(mEcmState, mDefaultState);
 */


import java.util.HashMap;

public class StateMechine {
	public int mStateStackTopIndex ;
	public StateInfo mStateStack[];
	public State mDestState;
	public int mTempStateStackCount;
	public HashMap<State, StateInfo> mStateInfo = new HashMap<State, StateInfo>();
	public StateInfo mTempStateStack[];
	public boolean mTransitionInProgress = false;

	
	
	public StateMechine() {
		// TODO Auto-generated constructor stub
		mTempStateStackCount = 0;
		mStateStackTopIndex = -1;
	}
	
	
	public void handleMessage(int msg) {
		State msgProcessedState = null;
		msgProcessedState = processMsg(msg); // 執行消息的處理  最終會執行到 狀態類的ProcessMessage
		performTransitions(msgProcessedState, msg); // 執行狀態的切換
		showState(msg);
	}
	
	
	public void showState(int msg) {
		System.out.println("狀態棧中存在"+(mStateStackTopIndex+1)+"個狀態分別爲");
		System.out.println("msg = "+ msg);
		int i = 0;
//		System.out.println("數組長度爲:"+mStateStack.length);
//		if(mStateStack[0] == null){
//			System.out.println("fuck0");
//		}
//		
//		if(mStateStack[1] == null){
//			System.out.println("fuck0");
//		}
		
		while( (i <= mStateStackTopIndex) && (mStateStack[i] != null) ){
			mStateStack[i].getClass().getSimpleName();
			System.out.println(i+ "  "+mStateStack[i].state.getClass().getSimpleName()    + "      " +mStateStack[i].toString());
			i++;
		}

	}
/*總結: 
 * 1. processMsg 是消息處理的函數,在該函數內部,會依次遍歷當前狀態StateInfo mStateStack[]數組中
 * 的每一個狀態State定義的 processMessage方法,依次從樹頂State 遍歷到 樹根State,processMessage函數
 * 返回true,那麼就說明 這個消息被這個狀態處理了。processMsg 會返回processMessage 處理msg爲true的那個樹節點 
 * 1.1 消息的處理一般會引起狀態State的切換,在ProcessMessage中會把 記錄當前樹頂狀態的切換爲需要切換到的
 * 目的狀態  mDestState.
 *  processMsg 完成兩件事   
 *  一:在當前狀態棧mStateStack中通過
 *	函數while (!curStateInfo.state.processMessage(msg)) {curStateInfo = curStateInfo.parentStateInfo;}
 *  找到數組中處理msg 並返回爲true的那個 StateInfo    【對應找到  State msgProcessedState】
 *   二: 在 處理msg 並返回爲true的那個 StateInfo的ProcessMessage方法中 會觸發狀態的切換 既通過方法
 * mDestState = (State) destState; 找到對應的  【對應找到  State mDestState】
 * 
 * 
 * 
 * 2.performTransitions  是狀態進行切換的操作函數,涉及到Map<State, StateInfo> 能通過這個Map拿到目標狀態的棧結構,
 *  正式狀態數組StateInfo mStateStack[] 及長度 mStateStackTopIndex
 * StateInfo mTempStateStack[] 臨時保存需要入棧的狀態的數組 及長度 mTempStateStackCount,
 * State mDestState  目標狀態,  StateInfo.active 是否在正式數組 mStateStack內bool標記
 * 來完成切換狀態時 從StateInfo mStateStack[]數組 執行退出exit,
 * 把新的StateInfo mTempStateStack[] 加入StateInfo mStateStack[] 執行 enter 方法的過程
 * */
	
	
	

	/*mStateStack 是一個結點的數組,這個數組裏面裝了當前StateInfo的結點對應關係
	 * 它的大小是通過計算最深層級關係得到的
	 * 
	 * 
	 * mStateStackTopIndex 是記錄StateInfo的結點在數組中最大的位置
	 * 
	 * */
	private State processMsg(int msg) { 
		StateInfo curStateInfo = mStateStack[mStateStackTopIndex];
		System.out.println("processMsg: " + curStateInfo.state.getName());
		while (!curStateInfo.state.processMessage(msg)) {
			curStateInfo = curStateInfo.parentStateInfo;
			if (curStateInfo == null) {
				break;
			}
			System.out.println("processMsg: " + curStateInfo.state.getName());

		}
		return (curStateInfo != null) ? curStateInfo.state : null;
	}


	/*mStateStack 是一個結點的數組,這個數組裏面裝了當前StateInfo的結點對應關係
	 * 它的大小是通過計算最深層級關係得到的
	 * 
	 * 
	 * mStateStackTopIndex 是記錄StateInfo的結點在數組中最大的位置
	 * 
	 * */
	private void performTransitions(State msgProcessedState, int msg) {
		State orgState = mStateStack[mStateStackTopIndex].state; // 就的狀態棧棧頂
		State destState = mDestState; // 新的狀態棧 需要的頂
		if (destState != null) {
			while (true) {
				// 執行之前狀態的 exit方法 執行新進入狀態的enter方法
				StateInfo commonStateInfo = setupTempStateStackWithStatesToEnter(destState);
				invokeExitMethods(commonStateInfo);
				int stateStackEnteringIndex = moveTempStateStackToStateStack();
				invokeEnterMethods(stateStackEnteringIndex);

				if (destState != mDestState) {
					destState = mDestState;
				} else {
					break;
				}
			}
		}
		mDestState = null;

	}

	
    public  void transitionTo(State destState) {
 
        	//System.out.println("transitionTo called while transition already in progress to " + mDestState + ", new target state=" + destState);

        mDestState = (State) destState;  // 就是把目標變量mDestState  變爲當前的狀態,後續執行enter方法
        //System.out.println("transitionTo: destState=" + mDestState.getName());
    }
    
    public  void completeConstruction(State state) {
        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;
            }
        }
        // 遍歷 HashMap<State, StateInfo>(); 依次回溯父類 得到最多父類的就是最深的長度
        mStateStack = new StateInfo[maxDepth];
        mTempStateStack = new StateInfo[maxDepth];
        mStateStackTopIndex = 0;
        mStateInfo.get(state).active = true;
        mStateStack[mStateStackTopIndex] = mStateInfo.get(state);
    }
    
    
//臨時數組  mTempStateStack[] 和正式數組mStateStack[]  之間邏輯處理 使得mStateStack[] 集合重新填充
	private final int moveTempStateStackToStateStack() {  
		// 從已經處理了離開的StateInfo數組 重新構建新的數組
		int startingIndex = mStateStackTopIndex + 1;  
		//臨時StateInfo數組的長度   StateInfo StateInfo.parent StateInfo.parent.parent 
		int i = mTempStateStackCount - 1;  
		int j = startingIndex; 
		while (i >= 0) {
			//System.out.println("moveTempStackToStateStack: i=" + i + ",j=" + j);
			
		//把在臨時StateInfo數組mTempStateStack中的StateInfo 依次加入到正式的記錄StateInfo數組
	   //加入的順序是 臨時數組mTempStateStack的最後一個StateInfo加入到正式StateInfo數組頂部
	  //... 臨時數組mTempStateStack的第一個StateInfo最終變爲正式StateInfo數組的頂部
			mStateStack[j] = mTempStateStack[i];  
			j += 1;
			i -= 1;
		}

		mStateStackTopIndex = j - 1;  // 記錄正式數組的位置

		//System.out.println("moveTempStackToStateStack: X mStateStackTop=" + mStateStackTopIndex + ",startingIndex="+ startingIndex + ",Top=" + mStateStack[mStateStackTopIndex].state.getName());

		return startingIndex;
	}

	// 對mStateStack 中的StateInfo數組 進行遍歷  依次排除掉直到 當前狀態是 commonStateInfo
	private final void invokeExitMethods(StateInfo commonStateInfo) {
		while ((mStateStackTopIndex >= 0) && (mStateStack[mStateStackTopIndex] != commonStateInfo)) {
			State curState = mStateStack[mStateStackTopIndex].state;
			System.out.println("invokeExitMethods: " + curState.getName());
			curState.exit();  // 執行從 mStateStack StateInfo 數組離開的狀態State的exit方法
			mStateStack[mStateStackTopIndex].active = false;  // 記錄當前StateInfo 不在棧中了
			mStateStackTopIndex -= 1;
		}
	}

	private final void invokeEnterMethods(int stateStackEnteringIndex) {
		// 在新構建的數組  mStateStack 以stateStackEnteringIndex起點 mStateStackTopIndex爲終點
		// 執行這些狀態的 enter() 方法
		for (int i = stateStackEnteringIndex; i <= mStateStackTopIndex; i++) {
			if (stateStackEnteringIndex == mStateStackTopIndex) {
				// Last enter state for transition
				mTransitionInProgress = false;
			}
			mStateStack[i].state.enter(); // 執行狀態的 enter 方法
			mStateStack[i].active = true;   // 記錄當前State是在 棧中了
		}
		mTransitionInProgress = false;
	}

	private StateInfo setupTempStateStackWithStatesToEnter(State destState) {

		mTempStateStackCount = 0;
		// 從HashMap獲得目標狀態destState 對應的結點 StateInfo
		StateInfo curStateInfo = mStateInfo.get(destState); 
		do {
			// 構建以destState爲起始的  最父類在最後的 臨時 StateInfo數組
			mTempStateStack[mTempStateStackCount++] = curStateInfo; 
			curStateInfo = curStateInfo.parentStateInfo;
			// 循環到父節點爲空  或者當前的這個結點已經到棧中了  滿足一個 退出循while環
		} while ((curStateInfo != null)  && (!curStateInfo.active));

		return curStateInfo;
	}


	private class StateInfo {
		State state;
		StateInfo parentStateInfo;

        /** True when the state has been entered and on the stack */
        boolean active;
        
		@Override
		public String toString() {
			return "state=" + state.getName() + ",parent="
					+ ((parentStateInfo == null) ? "null" : parentStateInfo.state.getName());
		}
	}

	
    public  StateInfo addState(State state, State parent) {  
        	//System.out.println("addStateInternal: E state=" + state.getName() + ",parent=" + ((parent == null) ? "" : parent.getName()));
     
        StateInfo parentStateInfo = null;
        if (parent != null) {
            parentStateInfo = mStateInfo.get(parent);
            if (parentStateInfo == null) {
                // Recursively add our parent as it's not been added yet.
                parentStateInfo = addState(parent, null);
            }
        }
        StateInfo stateInfo = mStateInfo.get(state);
        if (stateInfo == null) {
            stateInfo = new StateInfo();
            mStateInfo.put(state, stateInfo);  // 完成MAP的數據填充
        }

        // Validate that we aren't adding the same state in two different hierarchies.
        if ((stateInfo.parentStateInfo != null)
                && (stateInfo.parentStateInfo != parentStateInfo)) {
            throw new RuntimeException("state already added");
        }
        stateInfo.state = state;
        stateInfo.parentStateInfo = parentStateInfo;  // 完成父子關係的方法
        stateInfo.active = false;
        //System.out.println("addStateInternal: X stateInfo: " + stateInfo);
        return stateInfo;
    }
    

    private void removeState(State state) {   // 從Map移除
        StateInfo stateInfo = mStateInfo.get(state);
        if (stateInfo == null || stateInfo.active) {
            return;
        }
        boolean isParent = mStateInfo.values().stream()
                .filter(si -> si.parentStateInfo == stateInfo)
                .findAny()
                .isPresent();
        if (isParent) {
            return;
        }
        mStateInfo.remove(state);
    }
    
    private  State getCurrentState() {
        return mStateStack[mStateStackTopIndex].state;
    }
    
    
}


public class Controller extends StateMechine{




public static void main(String[] args) throws InterruptedException {
	Controller ctro = new Controller();
	for (int i = 1; i < 13; i++) {
		ctro.handleMessage(i);
		System.out.println("=============================================");
	    Thread.sleep(3000);
	}


}



DefaultState mDefaultState;
ApStaDisabledState mApStaDisabledState;
StaEnabledState mStaEnabledState;
DeviceActiveState mDeviceActiveState;
DeviceInactiveState  mDeviceInactiveState;
ScanOnlyLockHeldState  mScanOnlyLockHeldState;
FullLockHeldState mFullLockHeldState;
FullHighPerfLockHeldState mFullHighPerfLockHeldState;
NoLockHeldState mNoLockHeldState;
StaDisabledWithScanState mStaDisabledWithScanState;
ApEnabledState mApEnabledState;
EcmState mEcmState;


public Controller() {

	 mDefaultState = new DefaultState();
	 mApStaDisabledState = new ApStaDisabledState();
	 mStaEnabledState = new StaEnabledState();
	 mDeviceActiveState = new DeviceActiveState();
	  mDeviceInactiveState = new DeviceInactiveState();
	  mScanOnlyLockHeldState = new ScanOnlyLockHeldState();
	 mFullLockHeldState = new FullLockHeldState();
	 mFullHighPerfLockHeldState = new FullHighPerfLockHeldState();
	 mNoLockHeldState = new NoLockHeldState();
	 mStaDisabledWithScanState = new StaDisabledWithScanState();
	 mApEnabledState = new ApEnabledState();
	 mEcmState = new EcmState();
	
	
	 addState(mDefaultState,null);
	    addState(mApStaDisabledState, mDefaultState);
	    addState(mStaEnabledState, mDefaultState);
	        addState(mDeviceActiveState, mStaEnabledState);
	        addState(mDeviceInactiveState, mStaEnabledState);
	            addState(mScanOnlyLockHeldState, mDeviceInactiveState);
	            addState(mFullLockHeldState, mDeviceInactiveState);
	            addState(mFullHighPerfLockHeldState, mDeviceInactiveState);
	            addState(mNoLockHeldState, mDeviceInactiveState);
	    addState(mStaDisabledWithScanState, mDefaultState);
	    addState(mApEnabledState, mDefaultState);
	    addState(mEcmState, mDefaultState);
	    
	    completeConstruction(mDefaultState);
}
//============================================
class DefaultState extends State {
	
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("DefaultState-->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("DefaultState-->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {

	switch (msg) {
	case 1:
		transitionTo(mApStaDisabledState);
		return true;
	case 2:
		transitionTo(mStaEnabledState);
		return true;
	case 9:
		transitionTo(mStaDisabledWithScanState);
		return true;
	case 10:
		transitionTo(mApEnabledState);
		return true;
	case 11:
		transitionTo(mEcmState);
		return true;
	default:
		break;
	}
	return super.processMessage(msg);
}

}


//============================================
class ApStaDisabledState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("ApStaDisabledState-->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("ApStaDisabledState-->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}
}
//============================================
class StaEnabledState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("StaEnabledState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("StaEnabledState -->enter()");
		super.enter();
	}
	
	
@Override
public boolean processMessage(int msg) {
	switch (msg) {
	case 3:
		transitionTo(mDeviceActiveState);
		return true;
		
	case 4:
		transitionTo(mDeviceInactiveState);

		return true;

	default:
		break;
	}
	return super.processMessage(msg);
}
}
//============================================
class StaDisabledWithScanState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("StaDisabledWithScanState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("StaDisabledWithScanState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}

}
//============================================
class ApEnabledState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("ApEnabledState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("ApEnabledState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}

}
//============================================
class EcmState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("EcmState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("EcmState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}

}
//============================================
class DeviceActiveState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("DeviceActiveState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("DeviceActiveState -->enter()");
		super.enter();
	}
@Override
public boolean processMessage(int msg) {

	return super.processMessage(msg);
}

}
//============================================
class DeviceInactiveState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("DeviceInactiveState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("DeviceInactiveState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	switch (msg) {
	case 5:
		transitionTo(mScanOnlyLockHeldState);
		return true;
	case 6:
		transitionTo(mFullLockHeldState);
		return true;
	case 7:
		transitionTo(mFullHighPerfLockHeldState);
		return true;
	case 8:
		transitionTo(mNoLockHeldState);
		return true;
		
	default:
		break;
	}
	return super.processMessage(msg);
}

}
//============================================
class ScanOnlyLockHeldState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("ScanOnlyLockHeldState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("ScanOnlyLockHeldState -->enter()");
		super.enter();
	}
	
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}

}
//============================================
class FullLockHeldState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("FullLockHeldState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("FullLockHeldState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}
}
//============================================
class FullHighPerfLockHeldState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("FullHighPerfLockHeldState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("FullHighPerfLockHeldState -->enter()");
		super.enter();
	}
	
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}
}
//============================================
class NoLockHeldState extends State {
	@Override
	public void exit() {
		// TODO Auto-generated method stub
		System.out.println("NoLockHeldState -->exit() ");
		super.exit();
	}
	
	
	@Override
	public void enter() {
		// TODO Auto-generated method stub
		System.out.println("NoLockHeldState -->enter()");
		super.enter();
	}
	
@Override
public boolean processMessage(int msg) {
	// TODO Auto-generated method stub
	return super.processMessage(msg);
}
}


}


發佈了71 篇原創文章 · 獲贊 36 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章