Android Framework 状态机实现原理

本文探讨了Android Framework中状态机的实现原理,它采用状态模式和Handler机制处理消息,增强了代码可读性和拓展性。在初始化时,通过两个状态栈确保enter和exit方法的正确顺序。在处理消息时,状态机根据IState接口的processMessage方法决定是否处理消息,并进行状态切换。详细分析了状态切换过程,包括exit和enter方法的调用顺序。
摘要由CSDN通过智能技术生成

Android Framework 状态机实现原理

前言

状态模式是比较一种常见的设计模式,为了解决某个事物很多状态之间的切换很多的业务逻辑,这样可以避免很多if-else嵌套,不仅提高了代码的可读性,同样拓展性也得到很大的提升。在Android系统中,像wifi、蓝牙的源码中,看到状态机的使用,所以来学习下。状态机是对状态模式的一种拓展,使用了Handler机制来对消息的分发,同时还增加了 state-hierarchy 的模式,状态同样也有父状态,如果当前状态没有能力去处理当前消息,会去让父状态来处理。下面会从使用的角度来分析源码,来深入理解Android Framework 状态的机制。

我们使用Android源码中给的例子:

   
//首先初始化状态机,然后调用start()方法
public static Hsm1 makeHsm1() {
   
        System.out.println("makeHsm1 E");
        Hsm1 sm = new Hsm1("hsm1");  //Hsm1 extend StateMachine
        sm.start();
        System.out.println("makeHsm1 X");
        return sm;
}

//状态机的构造方法
   Hsm1(String name) {
   
        super(name);
        System.out.println("ctor E");

        //添加状态,其中mP1是mS1和mS2的父状态,
        addState(mP1);
        addState(mS1, mP1);
        addState(mS2, mP1);
        addState(mP2);

        // 需要设置一个初始状态
        setInitialState(mS1);
        System.out.println("ctor X");
    }

    //调用状态机方法,让状态机运行起来,然后发消息
    Hsm1 hsm1 = Hsm1.makeHsm1();
    hsm1.sendMessage(hsm1.obtainMessage(Hsm1.CMD_1));
    hsm1.sendMessage(hsm1.obtainMessage(Hsm1.CMD_2));

状态机初始化

状态机的初始化是调用了StateMachine.start()方法,看下源码:

public void start() {
   
    // 确保handler创建了
    SmHandler smh = mSmHandler;
    if (smh == null) return;

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

private final void completeConstruction() {
   
    if (mDbg) mSm.log("completeConstruction: E");

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值