• 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中处理。设备状态不同则动作不同:假设是已配对设备则点击后就进行连接。假设是为配对的设备点击后进行配对。假设是已连接的设备点击后断开连接。



  • 相关阅读:
    自我介绍
    工作流
    spring框架
    关于建立内部会议讨论规范的想法
    论文第3章:移动绘图平台的架构设计
    迭代器、推导式、函数式编程学习笔记
    Python装饰器学习(九步入门)
    Inkpad绘图原理浅析
    从零开始创建一个插件
    Entity Framework的启动速度优化
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7359634.html
Copyright © 2020-2023  润新知