標籤:string gets system article rac screen cal man 調用
本文為博主原創,轉載請註明出處:http://blog.csdn.net/zrf1335348191/article/details/50995466
藍芽相關代碼已在另兩篇文章中介紹,有須要的能夠查看
Android4.42-Settings原始碼分析之藍芽模組Bluetooth(上)
Android4.42-Setting原始碼分析之藍芽模組Bluetooth(下)
ONE,SWITCH藍芽開關
switch從建立到動作狀態監聽步驟例如以下
Switch actionBarSwitch = new Switch(activity);
activity.getActionBar().setCustomView(............);
- 通過構造方法將switch執行個體傳遞給BluetoothEnabler執行個體
mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
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。本地藍芽相關
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中處理。裝置狀態不同則動作不同:假設是已配對裝置則點擊後就進行串連。假設是為配對的裝置點擊後進行配對。假設是已串連的裝置點擊後中斷連線。
Android4.42-Settings原始碼分析之藍芽模組Bluetooth總體實現(總)