Android13 StatMachine创建流程分析

本文详细解析了AndroidFramework中StatMachine类的构造过程,涉及HandlerThread的创建、Looper的获取,以及SmHandler的构造和addState方法如何将HaltingState和QuittingState添加到状态机中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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加入到状态机中:

Android13 StatMachine addState流程分析-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值