概述:状态机工作流由一组状态组成。一个状态被指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当转换到最终状态时,工作流将完成。
状态机把整个复杂的过程分成若干个状态,一个状态执行完毕后,进入下一个状态。相同的事件在不同的状态下,执行操作也会不同。下面是状态机流程图样例 工作流可以自动进入下一个状态(根据你的业务逻辑),也可以由用户指定(procScanEvent)
下面请看具体的代码实现:
public class ScanStateMachine {
private State mState = State.INITIAL;
public enum State {
/**
* Initial state
*/
INITIAL {
@Override
public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
switch (event) {
case ACTIVITY_CREATED:
return INITIAL;
case ACTIVITY_BOOT_COMPLETED:
return IDLE;
case ACTIVITY_BOOT_FAILED:
return INITIAL;
default:
return super.getNextState(sm, event, prm);
}
}
},
/**
* The state before the job is started after the job has been created
*/
IDLE {
@Override
public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
switch (event) {
case CHANGE_JOB_STATE_PENDING:
return JOB_PENDING;
case REQUEST_JOB_START:
return WAITING_JOB_START;
//add
case ACTIVITY_CREATED:
return INITIAL;
default:
return super.getNextState(sm, event, prm);
}
}
},
WAITING_JOB_START {
@Override
public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
switch (event) {
case REQUEST_JOB_CANCEL:
return WAITING_JOB_CANCEL;
case CHANGE_JOB_STATE_PENDING:
return JOB_PENDING;
case CHANGE_JOB_STATE_PROCESSING:
return JOB_PROCESSING;
case CHANGE_JOB_STATE_ABORTED:
return JOB_ABORTED;
case CHANGE_JOB_STATE_CANCELED:
return JOB_CANCELED;
case ACTIVITY_DESTROYED:
return WAITING_JOB_CANCEL;
default:
return super.getNextState(sm, event, prm);
}
}
@Override
public void entry(final ScanStateMachine sm, final Object prm) {
super.entry(sm, prm);
sm.new StartScanJobTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
},
...;
/**
* Obtains the next state.
* Each state should override this method.
*
* @param sm
* @param event
* @param prm Object for additional information
* @return
*/
public State getNextState(final ScanStateMachine sm, final ScanEvent event, final Object prm) {
switch (event) {
default:
return null;
}
}
public void entry(final ScanStateMachine sm, final Object prm) {
}
public void exit(final ScanStateMachine sm, final Object prm) {
}
}
public void procScanEvent(final ScanEvent event, final Object prm) {
LogC.i(TAG, ">evtp :" + event);
mHandler.post(new Runnable() {
@Override
public void run() {
State newState = mState.getNextState(ScanStateMachine.this, event, prm);
if (newState != null) {
LogC.i(TAG, "#evtp :" + event + " state:" + mState + " > " + newState);
mState.exit(ScanStateMachine.this, prm);
mState = newState;
mState.entry(ScanStateMachine.this, prm);
}
}
});
}
}