Android4.42-Settings源代码分析之蓝牙模块Bluetooth总体实现(总)
本文为博主原创,转载请注明出处: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总体实现(总)的更多相关文章
- Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)
继上一篇Android系统源代码剖析(一)---Settings 接着来介绍一下设置中某个模块的源代码.本文依然是基于Android4.42源代码进行分析,分析一下蓝牙模块的实现.建议大致看一下关于S ...
- Android4.42-Setting源代码分析之蓝牙模块Bluetooth(下)
接着上一篇Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上) 继续蓝牙模块源代码的研究 THREE.蓝牙模块功能实现 switch的分析以及本机蓝牙重命名和可见性的分 ...
- Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)
背景 在学习BLE的过程中,积累了一些心得的DEMO,放到Github,形成本文.感兴趣的同学可以下载到源代码. github: https://github.com/vir56k/bluetooth ...
- nginx源代码分析--模块分类
ngx-modules Nginx 基本的模块大致能够分为四类: handler – 协同完毕client请求的处理.产生响应数据.比方模块, ngx_http_rewrite_module, ngx ...
- ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...
- Zepto核心模块源代码分析
一.Zepto核心模块架构 Zepto核心模块架构图 该图展示了Zepto核心模块架构代码的组织方式.主要分为私有变量.函数和暴露给用户的所有api. Zepto核心模块架构代码 该图展示了Zepto ...
- Android单片机与蓝牙模块通信实例代码
Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...
- Nouveau源代码分析(三):NVIDIA设备初始化之nouveau_drm_probe
Nouveau源代码分析(三) 向DRM注冊了Nouveau驱动之后,内核中的PCI模块就会扫描全部没有相应驱动的设备,然后和nouveau_drm_pci_table对比. 对于匹配的设备,PCI模 ...
- Android蓝牙实例(和单片机蓝牙模块通信)
最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码 ...
随机推荐
- mysql8.x开启远程登录
mysql8.x密码的认证方式变了,需要修改远程认证方式 问题描述 Connection to lab-130-mysql failed.Unable to load authentication p ...
- 查看Linux版本的命令
查看内核版本 [root@q1test01 ~]# cat /proc/version Linux version -.ELsmp (bhcompile@crowe.devel.redhat.com) ...
- 【图像处理】openCV光流法追踪运动物体
openCV光流法追踪运动物体 email:chentravelling@163.com 一.光流简单介绍 摘自:zouxy09 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观 ...
- mysql--SQL编程(基础知识) 学习笔记1
1.数据库应用类型分类: 一般来说,可将数据库的应用类型分为OLTP(OnLine TransactionProcessing ,联机事务处理)和OLAP(OnLine Analysis Proces ...
- activiti实战--第一章--认识Activiti
学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis ...
- .net获取当前url各种属性(文件名、参数、域名、端口等)的方法(转)
假设当前页完整地址是:http://www.test.com:80/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www ...
- SDL相关学习
原文地址:https://www.cnblogs.com/landmark/category/311822.html 介绍SDL图形库的使用 SDL显示文字 摘要: 前面教程里,我们只显示图片,没提到 ...
- openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)
openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...
- Android插件化与热修复(六)-微信Tinker原理分析
Tinker热修复原理分析 热补丁技术是在用户不需要重新安装应用的情况下实现应用更新,可快速解决一些线上问题.热补丁省去了Android应用发布版本的成本,而且用户端的更新也是无感知的. Tinker ...
- 测试rp文件
正文: 测试我的博客,我的资源在github上! 地址:https://github.com/gmqllf/tx-lcn