Android4.0中蓝牙适配器state machine(状态机)的分析

今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程。首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(frameworks/base/core/java/android/server/bluetoothadapterstatemachine.java):

    BluetoothAdapterStateMachine(Context context, BluetoothService bluetoothService,
                                 BluetoothAdapter bluetoothAdapter) {
……
	//bluetooth adapter的六个状态
        mBluetoothOn = new BluetoothOn();
        mSwitching = new Switching();
        mHotOff = new HotOff();
        mWarmUp = new WarmUp();
        mPowerOff = new PowerOff();
        mPerProcessState = new PerProcessState();
	……
}


 

bluetooth adapter有六个状态,分别为:

1BluetoothOn:就是打开的状态。

2Switching:可以认为是正在打开的状态。

3HotOff:这个状态可以理解为一个预热状态,他是在上电之后进行了一系列硬件初始化成功之后的状态,但是这种状态并不表现到ui上。但是从耗电的状态来看,他和2.3bluetooth on是一样的。

4WarmUp:可以理解为正在预热的状态,就是处于从断电到HotOff的状态。

5PowerOff:就是掉电的状态,也就是正在的关闭状态,这个时候bluetooth是没有耗电(准确说是耗电很少)。

6PerProcessState:他也是位于HotOffBluetoothOn之间的一个状态,和Switching的差别在于Swtiching是我们通过ui上去打开的“正在打开”的状态,而perprocess则是应用于一些临时使用蓝牙的application,这些application并不需要完整的蓝牙功能(比如说在蓝牙打开后的自动连接等),也不需要ui上去显示蓝牙的打开。所以,有这样一个过渡的状态,在changeBluetoothOn的时候并不会发出类似state_onbroadcaset。当然,这个状态的使用场合并不是很多,大家了解一下就可以了。

         各个状态之间的变化如下图所示。

从图中可以看出,这六个状态中有3个状态是bluetooth有可能长期处于的状态,也就是非中间状态,他们是BluetoothOnHotOff以及PowerOff。还有3个状态是中间状态,分别是SwitchingWarmUp以及PerProcessState

从代码来看,在最开始会处于PowerOff的状态,如下:

 BluetoothAdapterStateMachine(Context context, BluetoothService bluetoothService,
                                 BluetoothAdapter bluetoothAdapter) {
……
        setInitialState(mPowerOff); //初始化为PowerOff的状态
        mPublicState = BluetoothAdapter.STATE_OFF;
    }

因此,我们首先从PowerOff状态出发来分析:

 private class PowerOff extends State {
        @Override
  
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 源码适配器模式被广泛应用于 UI 层,特别是 ListView 和 RecyclerView 这样的列表控件。 举例来说,ListView 和 RecyclerView 的数据源都是一个 Adapter 对象,该对象负责将数据绑定到列表的视图上。Adapter 接口定义了一些方法,例如 getCount()、getItem() 和 getView() 等,用于获取数据总数、单个数据项和显示数据项对应的 View 视图。 具体来说,ListView 和 RecyclerView 会调用 Adapter 的 getCount() 方法获取数据总数,在绘制列表时会调用 getView() 方法获取每个数据项对应的 View 视图,并将数据绑定到视图上。如果数据源发生变化(例如添加或删除数据项),则需要调用 Adapter 的 notifyDataSetChanged() 方法通知列表控件重新绘制。 另外,RecyclerView 还引入了更高级的适配器模式,即 ViewHolder 模式。ViewHolder 模式可以减少 findViewById() 方法的调用次数,从而提高列表绘制的性能。在 ViewHolder 模式,Adapter 会持有一个 ViewHolder 对象,该对象用于存储数据项的视图和相关信息。RecyclerView 在绘制列表时,会先检查 ViewHolder 是否已创建,如果已创建则直接使用该 ViewHolder 对象,否则会创建一个新的 ViewHolder 对象并绑定到数据项上。 因此,适配器模式在 Android 源码起到了非常重要的作用,它使得列表控件的数据源和视图分离,提高了代码的可维护性和可重用性。同时,ViewHolder 模式更是提高了列表绘制的性能,优化了用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值