本文为博主原创,转载请注明出处:http://blog.csdn.net/zrf1335348191/article/details/50995466

蓝牙相关代码已在另两篇文章中介绍,有须要的能够查看

Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)

Android4.42-Setting源代码分析之蓝牙模块Bluetooth(下)

ONE,SWITCH蓝牙开关

switch从创建到动作状态监听步骤例如以下

  • 创建switch实例
Switch actionBarSwitch = new Switch(activity);
  • 将实例加入到actionbar
activity.getActionBar().setCustomView(............);
  • 通过构造方法将switch实例传递给BluetoothEnabler实例
mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
  • 在fragment中调用加入菜单的方法
setHasOptionsMenu(true);
  • 在onResume方法中对BluetoothEnabler的实例调用resume方法

以上一系列的代码都是在BluetoothSettings.java中完毕,接下来就是在BluetoothEnabler.java中进行处理

  • 推断蓝牙是否可用,不可用就把switch设置成不可点击
  • 依据本地蓝牙状态来更新switch状态
  • 注冊过滤BluetoothAdapter.ACTION_STATE_CHANGE的广播。当蓝牙状态发生变化时更新switch状态
  • 为switch加入监听事件,更改本地蓝牙适配器,当本地蓝牙适配器发生改变后更新switch状态

总结,switch相关的逻辑实现就这些。在BluetoothSettings中创建switch实例,在BluetoothEnabler.java中对switch的状态监听及更新,查看代码不难发现BluetoothEnabler.java类中是专门对switch进行处理的类。

TWO。本地蓝牙相关

  • 创建本地蓝牙的preference
mMyDevicePreference = new Preference(getActivity());
  • 显示到屏幕
preferenceScreen.addPreference(mMyDevicePreference);
  • 构造BluetoothDiscoverableEnabler的实例对mMyDevicePreference的副标题summary进行显示更新
mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
mLocalAdapter, mMyDevicePreference);
mDiscoverableEnabler.resume();

以上代码是在BluetoothSettings中完毕。preference包含title--蓝牙名称、summary---蓝牙可检測性的更新

蓝牙名称--title的更新过程在BluetoothSettings.java中完毕,步骤例如以下

  • 获取到本机蓝牙名称
mMyDevicePreference.setTitle(mLocalAdapter.getName());
  • 对蓝牙进行重命名操作时弹出对话框进行处理
new BluetoothNameDialogFragment().show(
getFragmentManager(), "rename device");

在BluetoothNameDialogFragment.java中监听对话框中的编辑框。假设被编辑就改动本地蓝牙的名称,该类专用于为本机蓝牙重命名。

mLocalAdapter.setName();

在当前的activity弹出对话框消失后程序不会运行onResume方法。所以在BluetoothSettings.java中注冊广播

  • 当本地蓝牙名称改变后会发送BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED的广播。BluetoothSettings.java监听到广播后对mMyDevicePreference的title进行更新

蓝牙可检測性---summary的更新显示

对于summary的显示更新的操作在BluetoothDiscoverableEnabler.java中完毕,该类专用于更新summary以及处理mMyDevicePreference的点击事件

  • 注冊广播监听蓝牙扫描状态的改变,当蓝牙扫描状态发生改变时会发送BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE广播。对summary进行更新显示。调用第三步的方法
  • 为preference设置点击监听,更改扫描状态
  • 依据本地蓝牙的扫描状态来显示summary

在显示summary时有两种情况,

i>。假设本地蓝牙既能够扫描又能够被检測到即处于SCAN_MODE_CONNECTABLE_DISCOVERABLE状态时。则依据可检測性时间的长短来显示,显示内容为:附近全部设备能够检測到+timeout

ii>,假设是别的状态,则要依据是否已经有已配对的设备进行显示,显示为“已配对设备可见”或者是“对全部设备不可见”

既然说到了可检測性。直接说一说可检測时间,在程序启动时注冊了广播BluetoothDiscoverableTimeoutReceiver,当可检測时间结束后就会将蓝牙的扫描状态设置为BluetoothAdapter.SCAN_MODE_CONNECTABLE,即取消对全部设备的可检測性

localBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);

当设定了可检測性为固定的一段时间后则会设置一个闹钟,用于触发广播,当所规定的时间到达时会触发广播。将手机蓝牙的可检測性关闭,假设想要永久的能够被检測到。则仅仅需讲闹钟取消掉,不再触发广播就可以

Intent intent = new Intent(INTENT_DISCOVERABLE_TIMEOUT);
intent.setClass(context, BluetoothDiscoverableTimeoutReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(
context, 0, intent, 0);
AlarmManager alarmManager =
(AlarmManager) context.getSystemService (Context.ALARM_SERVICE); if (pending != null) {
// Cancel any previous alarms that do the same thing.
alarmManager.cancel(pending);
Log.d(TAG, "setDiscoverableAlarm(): cancel prev alarm");
}
pending = PendingIntent.getBroadcast(
context, 0, intent, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pending);

对于可检測性时间到达时对蓝牙可检測性的设置在BluetoothDiscoverableTimeoutReceiver.java中。该类为广播组件。专门用于开启或者关闭可检測性的闹钟计时、关闭可检測性。

THREE,设备列表相关

加入已配对设别列表

  • 创建PreferenceCategory类型可配对设备列表对象mPairedDevicesCategory
mPairedDevicesCategory = new PreferenceCategory(getActivity());
  • 加入可配对设备列表mPairedDevicesCategory
addDeviceCategory(mPairedDevicesCategory,
R.string.bluetooth_preference_paired_devices,
BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
  • 调用例如以下方法将可配对设备列表传递给DeviceListPreferenceFragment进行管理
setDeviceListGroup(preferenceGroup);

以上代码在BluetoothSettings中完毕,接下来在DeviceListPreferenceFragment中对列表进行管理

  • 获取到设备缓存列表,该列表中存放已配对设设备和未配对设备,在程序成功安装后会通过BluetoothAdapter的getBondedDevices方法读取到已配对设备保存到缓存列表中
  • 为列表加入已配对的设备,所加入的对象为BluetoothDevicePreference构造的preference,也就是说单个设备的preference的管理在BluetoothDevicePreference中

加入附近可用设备列表

  • 点击扫描附近可用设备
  • 将附近可用设备列表显示到屏幕
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
  • 扫描到设备后缓存到缓存列表,然后显示到附近可用设备列表
  • 若附近可用设备列表为空,则移除

设备的点击事件在BluetoothDevicePreference中处理。设备状态不同则动作不同:假设是已配对设备则点击后就进行连接。假设是为配对的设备点击后进行配对。假设是已连接的设备点击后断开连接。

Android4.42-Settings源代码分析之蓝牙模块Bluetooth总体实现(总)的更多相关文章

  1. Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)

    继上一篇Android系统源代码剖析(一)---Settings 接着来介绍一下设置中某个模块的源代码.本文依然是基于Android4.42源代码进行分析,分析一下蓝牙模块的实现.建议大致看一下关于S ...

  2. Android4.42-Setting源代码分析之蓝牙模块Bluetooth(下)

    接着上一篇Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上) 继续蓝牙模块源代码的研究 THREE.蓝牙模块功能实现 switch的分析以及本机蓝牙重命名和可见性的分 ...

  3. Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)

    背景 在学习BLE的过程中,积累了一些心得的DEMO,放到Github,形成本文.感兴趣的同学可以下载到源代码. github: https://github.com/vir56k/bluetooth ...

  4. nginx源代码分析--模块分类

    ngx-modules Nginx 基本的模块大致能够分为四类: handler – 协同完毕client请求的处理.产生响应数据.比方模块, ngx_http_rewrite_module, ngx ...

  5. ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  6. Zepto核心模块源代码分析

    一.Zepto核心模块架构 Zepto核心模块架构图 该图展示了Zepto核心模块架构代码的组织方式.主要分为私有变量.函数和暴露给用户的所有api. Zepto核心模块架构代码 该图展示了Zepto ...

  7. Android单片机与蓝牙模块通信实例代码

    Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...

  8. Nouveau源代码分析(三):NVIDIA设备初始化之nouveau_drm_probe

    Nouveau源代码分析(三) 向DRM注冊了Nouveau驱动之后,内核中的PCI模块就会扫描全部没有相应驱动的设备,然后和nouveau_drm_pci_table对比. 对于匹配的设备,PCI模 ...

  9. Android蓝牙实例(和单片机蓝牙模块通信)

    最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码 ...

随机推荐

  1. UI Automation的两个成熟的框架(QTP 和Selenium)

    自己在google code中开源了自己一直以来做的两个自动化的框架,一个是针对QTP的一个是针对Selenium的,显而易见,一个是商业的UI automation工具,一个是开源的自动化工具. 只 ...

  2. 高效编写微信小程序

    原文:https://isux.tencent.com/high-performance-wechat-app-development.html 前言 微信小程序是一个工程,就和盖房子一样,打好了地基 ...

  3. Heroku第三方服务接入指南(二)

    上文我们讲了第三方服务.Heroku.用户三者的关系,这一篇进入正题,了解第三方厂商(下文简称厂商)怎样为Heroku开发服务.这里仅仅做简介,了解heroku大致是怎么做的.假设你的平台.希望接入第 ...

  4. MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

    在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新:如果插入的行数 ...

  5. swift类型转换之Could not cast value of type xxx to xxx错误的一种特殊情况记录

    之前swift项目打包成Framework静态库,提供给OC项目套入使用时,有时会抱这样一个错误: 这个错误发生的概率比较随机,有时会,有时不会,而且这句话在swift中的使用,是做model类型强制 ...

  6. java+win7+eclipse+Maven+sikuli 配置总结---图形脚本语言

    简介:Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术.它与我们常用的自动化测试技术(工具)有很大的区别. 关于配置,一直是一个问题,下面做个总体介绍,用sikuli也有几个月 ...

  7. I/O Completion Ports学习

    表示还是自己看MSDN最直接,别人的介绍都是嚼剩下,有木有? IO完成端口为在多处理器系统处理多个异步IO请求提供一个高效的线程模型.当一个进程新建一个完成端口,操作系统新建一个目的为服务这些请求的队 ...

  8. 环信EaseUI集成错误 Unknown type name 'NSString' NSLocalizedString

    环信集成本来认为很简单的,有现成的UI,照着文档直接傻瓜操作就行,没曾想聊天记录不能长时间保存,于是乎就有了这篇记录环信坑的笔记 在下载的环信的SDK时候里面会有两个包,一个完整版的,一个简洁版的,导 ...

  9. 基于matplotlib的数据可视化 - 等高线 contour 与 contourf

    contour 与contourf 是绘制等高线的利器. contour  - 绘制等高线 contourf - 填充等高线 两个的返回值值是一样的(return values are the sam ...

  10. PowerDsigner 16逆向工程导入mysql

    由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1.      安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...