蓝牙相关代码已在另两篇文章中介绍,有需要的可以查看
Android4.42-Settings源码分析之蓝牙模块Bluetooth(上)
Android4.42-Setting源码分析之蓝牙模块Bluetooth(下)
switch从创建到动作状态监听过程如下
Switch actionBarSwitch = new Switch(activity);
activity.getActionBar().setCustomView(............);
mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
setHasOptionsMenu(true);
以上一系列的代码都是在BluetoothSettings.java中完成,接下来就是在BluetoothEnabler.java中进行处理
总结,switch相关的逻辑实现就这些,在BluetoothSettings中创建switch实例,在BluetoothEnabler.java中对switch的状态监听及更新,查看代码不难发现BluetoothEnabler.java类中是专门对switch进行处理的类。
mMyDevicePreference = new Preference(getActivity());
preferenceScreen.addPreference(mMyDevicePreference);
mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(), mLocalAdapter, mMyDevicePreference); mDiscoverableEnabler.resume();
蓝牙名称--title的更新过程在BluetoothSettings.java中完成,过程如下
mMyDevicePreference.setTitle(mLocalAdapter.getName());
new BluetoothNameDialogFragment().show( getFragmentManager(), "rename device");
mLocalAdapter.setName();
在当前的activity弹出对话框消失后程序不会执行onResume方法,所以在BluetoothSettings.java中注册广播
蓝牙可检测性---summary的更新显示
对于summary的显示更新的操作在BluetoothDiscoverableEnabler.java中完成,该类专用于更新summary以及处理mMyDevicePreference的点击事件
在显示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中,该类为广播组件,专门用于开启或者关闭可检测性的闹钟计时、关闭可检测性。
添加已配对设别列表
mPairedDevicesCategory = new PreferenceCategory(getActivity());
addDeviceCategory(mPairedDevicesCategory, R.string.bluetooth_preference_paired_devices, BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
setDeviceListGroup(preferenceGroup);
添加附近可用设备列表
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
设备的点击事件在BluetoothDevicePreference中处理,设备状态不同则动作不同:如果是已配对设备则点击后就进行连接,如果是为配对的设备点击后进行配对,如果是已连接的设备点击后断开连接。