本文为博主原创,转载请注明出处: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中处理。设备状态不同则动作不同:假设是已配对设备则点击后就进行连接。假设是为配对的设备点击后进行配对。假设是已连接的设备点击后断开连接。

最新文章

  1. vs2010静态链接MFC库报链接错误
  2. MySQL 5.7 并行复制实现原理与调优
  3. JS-定时器管理实例
  4. codevs 2235 机票打折
  5. uml定义的使用的关系
  6. 安卓仿制新浪微博(一)之OAuth2授权接口
  7. Pet(dfs+vector)
  8. tmux tutorial
  9. 201521123037 《Java程序设计》第8周学习总结
  10. git工具使用说明
  11. SQL Server - CLUSTERED
  12. 【vue】在移动端使用better-scroll 实现滚动效果
  13. python3实现二叉树的遍历与递归算法解析
  14. jQuery实现购物车物品数量的加减
  15. Ubuntu server 网络配置中遇到的问题
  16. awk的用法
  17. pyhanlp python 脚本的demo补充
  18. 利用redis完成自动补全搜索功能(一)
  19. Waiting for possible shutdown message on port 4445
  20. tp5 根据经纬度计算门店距离 可排序

热门文章

  1. 〖Linux〗gun screen 配置文件
  2. (转)Delta3D源码分析
  3. Huginn部署到 Heroku
  4. ios中自定义checkbox
  5. Windows XPSP3通过网络级身份验证方式连接Windows Server 2008远程桌面
  6. java定时重启电脑程序demo
  7. nullpointerxception——处理思路
  8. sql server @@ROWCOUNT 会被 if 给 清 0
  9. select收数据
  10. Magento模型与ORM基础