以下是基于Android 4.2代码,对Bluetooth BR/EDR Enable process的分析。BluetoothAdapter类代表的是local device Bluetooth adapter,而BluetoothDevice类代表的是remote Bluetooth device。在Android 4.3中引入了一个新的类BluetoothManager,它是一个high level manager,被用于”to obtain an instance of an BluetoothAdapter and conduct overall Bluetooth Management“。

Bluetooth Enable process比较复杂,层次比较多,最好的分析方法是:对照logcat输出的Bluetooth相关log来阅读代码。首先从总体上介绍以下Enable process。UI上的入口是Settings,拨动Bluetooth开关,就启动了Bluetooth Enable process,最后由Bluedroid去enable Bluetooth hardware。当Bluetooth hardware enabled,这个enabled消息会一层层从Bluedroid上传到UI层,Settings收到这个消息就可以更新Bluetooth开关的状态了。具体过程如下图:

  1. Settings的BluetoothEnabler类(对应于UI上看到的Bluetooth开关),得到代表local device的BluetoothAdapter,再调用BluetoothAdapter::enable()。
  2. BluetoothAdapter基本上是个wrapper,不做具体的事情的。它直接调用BluetoothManagerService::enable()。
  3. BluetoothManagerService利用Binder机制会去connect AdapterService,最终会导致AdapterService::enable()被调用。BluetoothManagerService还会向AdapterService注册callback函数,用于接收Adapter State Change消息。
  4. AdapterService维护着一个状态机AdapterState,所有工作都是通过驱动状态机来完成的。AdapterState收到AdapterService发过来的USER_TURN_ON消息,就会调用AdapterService::processStart()来启动Profie Services的初始化和Bluetooth hardware enable process。此时Bluetooth Adapter的状态是BluetoothAdapter.STATE_TURNING_ON
  5. 每一个profile都有一个service。每个profile service启动完成后,都会通知AdapterService。当AdapterService::processProfileServiceStateChanged()确认所有的profile services都启动完成了,就会给状态机AdapterState发AdapterState.STARTED消息。
  6. 状态机AdapterState::PendingCommandState::processMessage()收到AdapterState.STARTED消息后就立刻调用AdapterService::enableNative()。
  7. AdapterService::enableNative()就是用来enable Bluetooth的Bluetooth JNI接口。enableNative()会调用Bluetooth HAL的enable()。
  8. Bluedroid用btif_enable_bluetooth()来实现了Bluetooth HAL的enable()。
  9. 当Bluedroid真正完成了enable Bluetooth hardware,就通过btif_enable_bluetooth_evt()中的HAL_CBACK调用Bluetooth JNI的adapter_state_change_callback(),这样就把BT_STATE_ON消息传递给了状态机AdapterState。
  10. AdapterState会把Bluetooth Adapter的状态转换到BluetoothAdapter.STATE_ON,并通过AdapterState::notifyAdapterStateChanged()通知AdapterService。
  11. AdapterService::updateAdapterState()会通过callback函数通知BluetoothManagerService,Adapter状态改变了。
  12. BluetoothManagerService确认状态发生了改变就会发出一个BluetoothAdapter.ACTION_STATE_CHANGE的intent。
  13. Settings的BluetoothEnabler收到这个intent之后,就会去更新UI上Bluetooth开关的状态。
注:以上过程的描述,并不包含这个过程的所有函数调用,只是给出了关键的函数和状态。

Android 打开蓝牙流程相关推荐

  1. Android 打开蓝牙状态栏显示蓝牙图标 2020-12-03

    系统默认是蓝牙链接后才在状态栏显示蓝牙图标 现在修改为打开蓝牙就在状态栏显示蓝牙图标 frameworks/base/packages/SystemUI/src/com/android/systemu ...

  2. Bluedroid 打开蓝牙流程

    1.bluetooth.cc enable执行打开蓝牙 static int enable(bool start_restricted) {   LOG_INFO(LOG_TAG, "%s: ...

  3. Android打开蓝牙的两种方法

    1.隐式打开蓝牙 /*隐式打开蓝牙*/if (!mBluetoothAdapter.isEnabled()) {mBluetoothAdapter.enable();} 2.弹出对话框供用户选择是否打 ...

  4. android打开蓝牙设置界面,Android 点击跳转到蓝牙设置界面

    基于H5的微信支付开发详解 这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲 ...

  5. Android打开蓝牙的两种方式

    隐式打开方式 关键API使用如下: if ( !bluetoothAdapter.isEnabled()) {boolean res = bluetoothAdapter.enable();} 完整判 ...

  6. android 打开蓝牙可被发现,手机蓝牙隐藏功能,竟然被学姐发现了!

    大家好,我是学姐.今天跟大家聊聊蓝牙.那么什么是蓝牙呢?所谓蓝牙,其实就是一种短距离无线电技术,用于数据传输.学姐在十年前,那时候用的爱立信和诺基亚手机,就有蓝牙功能.学姐经常和同学朋友,利用手机的蓝 ...

  7. android 打开蓝牙语音拨号功能

    修改mediatek/external/bluetooth/bt_cust/bt_cust_table.h文件,将HFPVoiceRecognition属性的值改为1.     {         . ...

  8. android -- 蓝牙 bluetooth (二) 打开蓝牙

    4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...

  9. Android 上层蓝牙enable流程

    Android 蓝牙框架 基于Android9.0 Amlogic代码分析, 蓝牙应用通过 Binder 与蓝牙进程进行通信.蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访 ...

最新文章

  1. 15个产业级算法推出、35个高精度预训练模型上线!最强国产开源AI框架再进化,密集提升视觉产业实战能力...
  2. 2020新版IDEA创建Web工程(包括添加Tomcat服务器、第三方jar包)
  3. 化工仪表和自动化(自动控制系统)
  4. shell编程之文本处理工具sed
  5. 使用Jexus服务器运行Asp.Net Core2.0程序
  6. 【SpringBoot 2】(九)异常处理 web原生组件的注入
  7. TutorialsPoint 电子书 归档 2017
  8. OpenWrt分支LEDE嵌入式无线路由系统定制-1.编辑环境搭建
  9. 帧中继环境下ospf的使用(点到点模式)
  10. mysql 中文字符 函数_MySQL基础之字符函数-Go语言中文社区
  11. 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理...
  12. javaEE学习笔记—————利用代理模式和过滤器增强对象功能完成敏感词汇过滤功能
  13. C++信息学奥赛一本通_1020
  14. 微商模式的出路在哪里?
  15. TX2--Building OpenCV for Tegra with CUDA
  16. android xml绘制图标,android – 如何为图标制作XML文件
  17. 菜鸟起步2-逆向分析学习
  18. DPVS安装配置、使用(1)
  19. Webpack项目中引入Bootstrap4.x
  20. 如何检查并清除挖矿程序

热门文章

  1. window8.1中用户的管理员权限的提升方法
  2. DockLayout布局
  3. C++ 对象模型学习记录(3)--- 第1章 关于对象(未完)
  4. IT也要健康:帮助你保持健康的几个重要因素
  5. 分享一些很不错的学习资源网站
  6. 远程开发工作具备因素有哪些?
  7. C Linux 文件加锁 lock fcntl
  8. 3dmax如何显示参考图_3d效果图渲染丢材质、丢贴图该如何解决?
  9. 关于微信小程序中uView中通过packer选择器修改表单无法触发form组件的表单验证的问题
  10. python画cpk图_TensorFlow——Checkpoint为模型添加检查点的实例