前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android4.42-Settings源码分析之蓝牙模块Bluetooth整体实现(总)

Android4.42-Settings源码分析之蓝牙模块Bluetooth整体实现(总)

作者头像
fanfan
发布2022-05-07 14:37:28
4800
发布2022-05-07 14:37:28
举报
文章被收录于专栏:编程思想之路编程思想之路

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

蓝牙相关代码已在另两篇文章中介绍,有需要的可以查看

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

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

ONE,SWITCH蓝牙开关

switch从创建到动作状态监听过程如下

  • 创建switch实例
代码语言:javascript
复制
Switch actionBarSwitch = new Switch(activity);
  • 将实例添加到actionbar
代码语言:javascript
复制
activity.getActionBar().setCustomView(............);
  • 通过构造方法将switch实例传递给BluetoothEnabler实例
代码语言:javascript
复制
mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
  • 在fragment中调用添加菜单的方法
代码语言:javascript
复制
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
代码语言:javascript
复制
mMyDevicePreference = new Preference(getActivity());
  • 显示到屏幕
代码语言:javascript
复制
preferenceScreen.addPreference(mMyDevicePreference);
  • 构造BluetoothDiscoverableEnabler的实例对mMyDevicePreference的副标题summary进行显示更新
代码语言:javascript
复制
mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
                                mLocalAdapter, mMyDevicePreference);
                        mDiscoverableEnabler.resume();

以上代码是在BluetoothSettings中完成,preference包括title--蓝牙名称、summary---蓝牙可检测性的更新

蓝牙名称--title的更新过程在BluetoothSettings.java中完成,过程如下

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

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

代码语言:javascript
复制
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,即取消对所有设备的可检测性

代码语言:javascript
复制
localBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);

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

代码语言:javascript
复制
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
代码语言:javascript
复制
mPairedDevicesCategory = new PreferenceCategory(getActivity());
  • 添加可配对设备列表mPairedDevicesCategory
代码语言:javascript
复制
addDeviceCategory(mPairedDevicesCategory,
                        R.string.bluetooth_preference_paired_devices,
                        BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
  • 调用如下方法将可配对设备列表传递给DeviceListPreferenceFragment进行管理
代码语言:javascript
复制
setDeviceListGroup(preferenceGroup);

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

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

添加附近可用设备列表

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文为博主原创,转载请注明出处:http://blog.csdn.net/zrf1335348191/article/details/50995466
  • ONE,SWITCH蓝牙开关
  • TWO,本地蓝牙相关
  • THREE,设备列表相关
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档