继续蓝牙模块源码的研究
THREE,蓝牙模块功能实现
switch的分析以及本机蓝牙重命名和可见性的分析见上一篇,接下来进行第三章第三部分的介绍:关于蓝牙远程设备列表的加载。如果没有看过,建议看看上一篇关第一章蓝牙的布局,有助于理解
3>,设备列表的加载
因为这部分代码很多,所以在介绍时先说一下思路,程序首先通过底层的BluetoothAdapter的getBondedDevices()方法获取到已配对的设备列表,获取到列表后将数据缓存在List<CachedBluetoothDevice>中进行备份,当蓝牙界面启动后会从缓存中读取数据并显示已配对设备列表mPairedDevicesCategory,在扫描附近可用设备时会对缓存中的数据进行增加或者删除,并将数据显示在可用设备列表mAvailableDevicesCategory,并且程序会实时监听远程设备的状态变化,进行对设备列表的增加或删除。设备列表的加载基本上就是这些,接下来挨个介绍
i>,调用底层代码获取可用设备列表并进行缓存
这部分代码的书写在BluetoothEventManager.java文件中,获取已配对设备列表的代码定义如下,
boolean readPairedDevices() {
//mLocalAdapter是将BluetoothAdapter映射到本地,其内部代码不再书写,获取到已配对设备
Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
if (bondedDevices == null) {
return false;
}
boolean deviceAdded = false;
for (BluetoothDevice device : bondedDevices) {
//这一步调用的是设备缓存列表的管理类CachedBluetoothDeviceManager中的方法findDevice
//用于检查缓存列表中是否已经存在该device,若存在就将device返回,若不存在就返回null
CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device);
if (cachedDevice == null) {
//如果缓存列表中没有该设备就调用管理类CachedBluetoothDeviceManager中的addDevice
//将设备添加到缓存列表中
cachedDevice = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, device);
//将设备更新到屏幕上
dispatchDeviceAdded(cachedDevice);
deviceAdded = true;
}
}
return deviceAdded;
}
该方法在两个地方调用,一个是当本地蓝牙BluetoothAdapter开启后调用,一个就是当远程设备BluetoothDevice的状态发生改变时调用
如下,是在LocalBluetoothProfileManager.java文件中的代码,在蓝牙开启后会调用如下代码读取已配对的设备
void setBluetoothStateOn() {
ParcelUuid[] uuids = mLocalAdapter.getUuids();
if (uuids != null) {
updateLocalProfiles(uuids);
}
mEventManager.readPairedDevices();
}
当远程设备发生改变时会发送ACTION_BOND_STATE_CHANGED的广播,在注册的handler中调用readPairedDevices()方法读取配对设备。监听广播的代码在BluetoothEventManager.java中。
其实,在进行扫描后,获取的设备列表与可配对设备列表缓存在一起,这部分在介绍扫描处介绍
ii>,设备列表加载到屏幕
现在不论是已配对设备或是附近可用设备均缓存在同一列表,所以两个列表的加载类似,附近可用设备列表显示时会有一个progress,所以在构造preferenceGroup对象时有所区别,还有一个区别就是设备的状态,通过底层的BluetoothDevice类中的getBondState()来获取远程设备的配对状态来区分。
设备列表的加载为BluetoothSettings中,已配对设备列表为mPairedDevicesCategory,附近可用设备列表为mAvailableDevicesCategory,均为PreferenceCategory对象,加载时调用的是BluetoothSettings.java中的addDeviceCategory(PreferenceGroup preferenceGroup,int titleId,BluetoothDeviceFilter.Filter filter)方法。
已配对设备设置的过滤器为BluetoothDeviceFilter.BONDED_DEVICE_FILTER
附近可用设备设置的过滤器为Bl