蓝牙状态机源码管窥

本文深入探讨了Android中蓝牙状态机的初始化过程,包括子线程、树形层次结构状态机的初始化和启动状态机的步骤。状态机的转换通过transitionTo方法实现,涉及状态的进入和退出操作。在消息处理中,状态机根据当前状态及其父状态处理消息,确保状态的正确切换。蓝牙状态机的实例展示了如何在实际应用中运用这些概念。
摘要由CSDN通过智能技术生成

5, 状态机

最早接触状态机是在数字电路中,比如十字路口的红绿黄灯,行人可以根据不同的状态而做出不同的行为.我觉得在状态机中至少有3个主要内容:

1,状态的管理

2,状态的切换

3,行为的执行

5.1初始化


初始化主要分为三个步骤:

5.1.1,子线程的初始化

在StateMachine的构造函数中,首先构造一个子线程,Looper,然后不断进行消息循环,最后利用该Looper初始化状态机,实例化SmHandler,

1.   protected StateMachine(String name) {

2.           mSmThread = new HandlerThread(name);

3.           mSmThread.start();

4.           Looper looper = mSmThread.getLooper();

5.    

6.           initStateMachine(name,looper);

7.       }

HandlerThread类相关方法如下:

8.   public HandlerThread(String name) {

9.           super(name);

10.          mPriority =Process.THREAD_PRIORITY_DEFAULT; // 设置线程优先级

11.      }

 

12.  @Override

13.      public void run() {

14.          mTid = Process.myTid();

15.          Looper.prepare(); // 构造该线程的looper

16.          synchronized (this) {

17.              mLooper = Looper.myLooper();// 获取该线程的looper

18.              notifyAll();

19.          }

20.          Process.setThreadPriority(mPriority);

21.          onLooperPrepared();

22.          Looper.loop(); // 开始消息循环

23.          mTid = -1;

24.      }

 

25.  private void initStateMachine(String name,Looper looper) {

26.          mName = name;

27.          mSmHandler = new SmHandler(looper,this);

28.      }

 

29.  private SmHandler(Looper looper, StateMachinesm) {

30.              super(looper);

31.              mSm = sm;

32.   

33.              addState(mHaltingState, null);

34.              addState(mQuittingState, null);

35.          }

36.   

HaltingState与QuittingState都是State的派生类,用于在状态停止和放弃之后处理的一些事情;都重写了ProcessMessage方法,

在StateMachine没有实际行动仅仅保留用于扩展。

SmHandler才是整个状态机的核心, StateMachine(主线程)中的相关函数/消息 都在SmHandler(字线程)进行处理,最后通过消息的形式发送出去,主线程进行处理。

5.1.2, 树形层次结构状态机的初始化

1.   private HeadsetClientStateMachine(HeadsetClientServicecontext) {

2.           super(TAG);

3.           mService = context;

4.    

5.           mAdapter =BluetoothAdapter.getDefaultAdapter();

6.           ···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值