android StateMachine.java

原创 2015年11月18日 23:30:23

android 4.0.4: /frameworks/base/core/java/com/android/internal/util/StateMachine.java

StateMachine状态机中,会创建HandlerThread线程,和依附该线程的Handler;消息处理都是在HandlerThread中执行

framework层的好几个状态机,都是在StateMachine基础上实现的,比如:WifiStateMachine、DhcpStateMachine、WifiWatchdogStateMachine。。。

http://androidxref.com/4.0.4/xref/frameworks/base/core/java/com/android/internal/util/StateMachine.java

SmHandler:

       /**
         * Handle messages sent to the state machine by calling
         * the current state's processMessage. It also handles
         * the enter/exit calls and placing any deferred messages
         * back onto the queue when transitioning to a new state.
         */
        @Override
        public final void handleMessage(Message msg) {
            if (mDbg) Log.d(TAG, "handleMessage: E msg.what=" + msg.what);

            /** Save the current message */
            mMsg = msg;

            /**
             * Check that construction was completed
             */
            if (!mIsConstructionCompleted) {
                Log.e(TAG, "The start method not called, ignore msg: " + msg);//  在状态机没有启动之前,收到msg,只是打印error日志
                return;
            }


            /**
             * Process the message abiding by the hierarchical semantics
             * and perform any requested transitions.
             */
            processMsg(msg);
            performTransitions();

            if (mDbg) Log.d(TAG, "handleMessage: X");
        }


        /**
         * Complete the construction of the state machine.
         */
        private final void completeConstruction() {
            if (mDbg) Log.d(TAG, "completeConstruction: E");

            /**
             * Determine the maximum depth of the state hierarchy
             * so we can allocate the state stacks.
             */
            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;
                }
            }
            if (mDbg) Log.d(TAG, "completeConstruction: maxDepth=" + maxDepth);

            mStateStack = new StateInfo[maxDepth];
            mTempStateStack = new StateInfo[maxDepth];
            setupInitialStateStack();

            /**
             * Construction is complete call all enter methods
             * starting at the first entry.
             */
            mIsConstructionCompleted = true;
            mMsg = obtainMessage(SM_INIT_CMD);
            invokeEnterMethods(0);// 初始状态的enter方法,在调用线程中执行;即如果在UI线程中,调用状态机的start()方法,则初始状态的enter方法,在UI线程中执行,如果enter方法中有耗时的操作,肯定会占用UI线程的资源

            /**
             * Perform any transitions requested by the enter methods
             */
            performTransitions();// 如果初始状态的enter方法中,有跳转,即调用了transitionTo方法,则初始状态的exit方法、新状态的enter方法,也都会在调用线程中执行,依次类推,也会进一步占用调用线程的资源

            if (mDbg) Log.d(TAG, "completeConstruction: X");
        }

StateMachine:

    /**
     * Start the state machine.
     */
    public void start() {
        // mSmHandler can be null if the state machine has quit.
        if (mSmHandler == null) return;

        /** Send the complete construction message */
        mSmHandler.completeConstruction();
    }

///////////////////////////////////////////////////////////////////////////////////////////////////////////     

android 4.1.1: /frameworks/base/core/java/com/android/internal/util/StateMachine.java

http://androidxref.com/4.1.1/xref/frameworks/base/core/java/com/android/internal/util/StateMachine.java

SmHandler:

        /**
         * Handle messages sent to the state machine by calling
         * the current state's processMessage. It also handles
         * the enter/exit calls and placing any deferred messages
         * back onto the queue when transitioning to a new state.
         */
        @Override
        public final void handleMessage(Message msg) {
            if (mDbg) Log.d(TAG, "handleMessage: E msg.what=" + msg.what);

            /** Save the current message */
            mMsg = msg;

            if (mIsConstructionCompleted) {
                /** Normal path */
                processMsg(msg);
            } else if (!mIsConstructionCompleted && (mMsg.what == SM_INIT_CMD) && (mMsg.obj == mSmHandlerObj)) {
                /** Initial one time path. */
                mIsConstructionCompleted = true;// 调用start方法,走该分支一次;后面处理消息,都走前面的分支processMsg;(在HandlerThread线程中执行)
                invokeEnterMethods(0);

            } else {
                throw new RuntimeException("StateMachine.handleMessage: " + "The start method not called, received msg: " + msg);//  这里也是修改点,状态机没有启动之前,即没有调用start()方法之前,在4.0.4上,是打印error日志;在4.1.1上,则是
            }
            performTransitions();

            if (mDbg) Log.d(TAG, "handleMessage: X");
        }


        /**
         * Complete the construction of the state machine.
         */
        private final void completeConstruction() {
            if (mDbg) Log.d(TAG, "completeConstruction: E");

            /**
             * Determine the maximum depth of the state hierarchy
             * so we can allocate the state stacks.
             */
            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;
                }
            }
            if (mDbg) Log.d(TAG, "completeConstruction: maxDepth=" + maxDepth);

            mStateStack = new StateInfo[maxDepth];
            mTempStateStack = new StateInfo[maxDepth];
            setupInitialStateStack();

            /** Sending SM_INIT_CMD message to invoke enter methods asynchronously */
            sendMessageAtFrontOfQueue(obtainMessage(SM_INIT_CMD, mSmHandlerObj));// 不同于4.0.4,比如:在UI线程中,调用状态机的start方法,这里只是把SM_INIT_CMD消息发送给HandlerThread中的Handler处理,初始状态的enter、exit方法,都是在状态机的HandlerThread线程中执行的,不会占用UI线程的资源^-^算是一个小改进吧


            if (mDbg) Log.d(TAG, "completeConstruction: X");
        }

StateMachine:

    /**
     * Enqueue a message to the front of the queue for this state machine.
     * Protected, may only be called by instances of StateMachine.
     */
    protected final void sendMessageAtFrontOfQueue(int what, Object obj) {
        mSmHandler.sendMessageAtFrontOfQueue(obtainMessage(what, obj));
    }

StateMachine 的简单使用

StateMachine 的简单使用步骤 源码的frameworks/base/core/java/com/android/internal/util里面把StateMachine.java 、Sta...
  • SelfLearner
  • SelfLearner
  • 2017年03月17日 10:53
  • 439

Android studio Android Monitor介绍一

摘要: Android Monitor 很强大,有5个模块,Memory、Network、logcat、CPU、GPU。现在分5篇文章分别介绍。 一、Memory 这个模块包括4个功能,分...
  • yangaiyu
  • yangaiyu
  • 2017年03月21日 09:40
  • 1741

安卓基础-简单了解位运算(&、|、^、<<、>>)

背景       位运算在安卓中使用很广泛,开发中也许我们使用的比较少,但是当遇到位运算的时候,我们得看得懂。 位运算在安卓中简单使用的例子: 位运算DEMO 接下来,我通过一个简单的...
  • u010052279
  • u010052279
  • 2016年10月10日 13:35
  • 1163

Android关于透明度对应表

100% — FF 95% — F2 90% — E6 85% — D9 80% — CC 75% — BF 70% — B3 65% — A6 60% — 99 55% — 8C ...
  • iblade
  • iblade
  • 2016年05月20日 09:42
  • 1970

八款android日历 [Calendar] 开源项目框架分类总汇

八款android日历 [Calendar] 开源项目框架分类总汇:   1.CircleTimerView 2.SlideDateTimePicker时间选择器 3....
  • JunTang2015
  • JunTang2015
  • 2015年10月13日 16:37
  • 6775

Android中三种锁的用法

一、synchronized 略   二、lock Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获...
  • boyupeng
  • boyupeng
  • 2015年09月02日 17:58
  • 6544

android 仿excel表格

1.activity /** * 采购需求 * Created by Administrator on 2016/10/13. */ public class PurchaseRequireA...
  • u012482178
  • u012482178
  • 2016年10月26日 14:51
  • 2376

Android中常见正则表达式总结

项目中用到的正则表达式,主要是匹配AndroidManifest文件的,在此做笔记,方便以后查看,后续遇到其他类型的再更新...
  • sophieDJF
  • sophieDJF
  • 2017年08月07日 17:00
  • 552

Android FrameLayout的android:foreground属性可以设置单击时的前景色

触摸之后,设置前景色,可以告诉用户确实单击了,增加用户体验。
  • jdsjlzx
  • jdsjlzx
  • 2013年10月31日 20:20
  • 15771

Android进阶系列之AOP面向切面编程

Android的博大精深,不是一言两语能够说明道清的,它的魅力只有亲身去接触才能体会。就像美女一样 我先在这里申明一下,我这篇AOP只是学习笔记,适合入门级选手,如果阁下是大神想要参考AOP,那么...
  • sw5131899
  • sw5131899
  • 2016年12月26日 17:30
  • 4886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android StateMachine.java
举报原因:
原因补充:

(最多只允许输入30个字)