增添了InboundSmsHandler继承自stateMachine,在这里面统一处理,当有新短信时会收到EVENT_NEW_SMS消息。他内部会有各种state内部类,这些state有些成员函数是必须重写的,像processMessage(),enter()方法是当我们进入该状态的时候第需要调用的(像程序代码中的构造函数),exit()是退出该状态的时候调用(像析构函数.
当准备好State后,就在调用addState(State state, State parent)将我们的状态添加进StateMachine,形成状态树。
stateMachine有个内部类SmHandler(大部分处理都是通过这个类完成),ProcessedMessageInfo,ProcessedMessages。在SmHandler中又包含内部类StateInfo,成员StateMachine(mSm),HashMap<State, StateInfo> mStateInfo,mStateStack,mDeferredMessages,State mInitialState, State mDestState, rivate ArrayList<Message> mDeferredMessages。
启动状态机的步骤:
1.首先需要通过addState添加上面准备好的State实例,每一个State都可以添加一个自身的State和一个parentState。add的方法最中是通过调用SmHandler的StateInfo addState(State state, State parent)方法。这个方法会将他的状态以及他的父状态的信息取出来并放到mStateInfo这个hashMap表中的(首先会从mStateInfo中通过State找一下是否存在该状态的相关信息,不存在才会put)。
2.添加完所有的状态后就调用setInitialState设置一个初始状态, 最终调用的是SmHandler的setInitialState给mInitialState赋值。
3当经过1,2步骤后就要调用StateMachine:start()函数启动状态机机,start函数最终调用的是SmHandler:completeConstruction ,这个函数主要是调用exit退出当前状态并更新记录的State的堆栈信息(mStateStack中的State)并掉用State的enter函数,正式进入新的状态。
4.当我们通过StateMachine:sendMessage发送消息的时候,StateMachine就会找到当前的State调用其processMessage来做相应的处理动作。如果当前状态在处理完相应的事务后需要切换到新的状态就需要调用transitionTo(IState destState)设置mDestState的值。
注意:上面说过一个State可能包含一个Parent State,如果在当前的State中没有能处理发送来的msg的时候,就要向上找其父State来处理,依次向上遍历,如果所有的State都不能处理的话就会调用SmHandler:unhandledMessage来处理。
另外两个方法:deferMessage和sendMessageAtFrontOfQueue,在代码中可以通过deferMessage向mDeferredMessages这种存放暂时不处理的消息。在每此处理完新旧状态更新的时候就要调用sendMessageAtFrontOfQueue将mDeferredMessages中的消息优先发送出去(有可能是在A状态deferMessage的消息,切换到B状态后才发送出去,此时就应该B状态去处理这个消息),每次发送完就会清空mDeferredMessages一次。
短彩信统一在processMessagePart中处理,wappush消息由dispatchwappush处理。带端口以及普通的短彩信都是在processMessagePart处理并发送通知intent的。
转载地址:http://blog.csdn.net/zhgeliang/article/details/38873567