BluetoothService裡定義的Native方法都在android_server_BluetoothServer.cpp裡建立jni調用
開啟


由BluetoothEnabler控制,在構造裡會先調用 LocalBluetoothManager.getInstance(coNtext),在getInstance裡會調用init()函數,BluetoothAdapter.getDefaultAdapter()獲得藍牙設備的控制碼,如果當前沒有藍牙設備則返回null。


初始化完畢會監聽checkbox的狀態,當點擊checkbox會調用 LocalBluetoothManager.setBluetoothEnabled(enable)函數。調用mAdapter.enable()到 BluetoothService.enable()開啟EnableThread執行緒,進行打開操作,同時調到 CachedBluetoothDeviceManager.onBluetoothStateChanged來讀取上次關閉之前搜索到device.


涉及到的類:


BluetoothService(最主要的類,開啟具體命令的執行緒進行enadble,disable等操作)


LocalBluetoothManager(初始化BluetoothAdapter)


BluetoothEnabler(介面的點擊和狀態文字的顯示)


BluetoothAdapter(建立LocalBluetoothManager和BluetoothService的映射關係,主要是通過它調用BluetoothService的函數)
掃描


在BluetoothSetting裡觸發點擊,調用LocalBluetoothManager.startScanning(true)函數,通過BluetoothAdapter的startDiscovery調用到BluetoothService裡的startDiscovery來調用Native函數 startDiscoveryNative()。


startDiscovery()是個非同步函數,會立即返回,通過註冊 ACTION_DISCOVERY_STARTED、ACTION_DISCOVERY_FINISHED、ACTION_FOUND,來確定當前的狀態。


當藍牙由disable變成enable時會調用掃描,當距離上次掃描超過5分鐘的前提下,退出頁面,再進到頁面的時候也會啟動掃描。


在啟動scan的時候,還會判斷當前是否在播放音樂,如果在播放音樂,則不啟動掃描。


點擊查找設備後,會把設備清單裡沒有配對的設備清除掉,保留配對狀態的設備。


掃描的過程是一個很耗費資源的過程,在掃描過程,不會去嘗試進行新的連接,掃描時間預設是12秒,它是以一個系統服務的形式存在的,可以調用cancelDiscovery()來取消掃描。
連接


在setting介面點擊連接,會調到CachedBluetoothDevice類的connect方法,調用 updateProfiles(),根據搜索到的device的uuid來向ProfilesList裡添加profile,然後遍歷 ProfileList,根據不同的profile來獲得profileManager。


然後判斷當前的device的Priority,如果Priority=100,則去調用queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile)),去發送連接的命令。如果Priority=1,則不去自動連接。Priority=-1,代表當前的device沒有配對。


在queueCommand()函數裡,有一個訊息佇列來處理命令,在這裡生成了一個BluetoothJob的實例,來代表要執行的命令。


最終調到processCommand(BluetoothJob job)函數,由它來通過job.command來調用CONNECT: DISCONNECT:REMOVE_BOND:


以A2DP為例,在connectInt裡,根據不同的profile來獲得profilemanger,然後調用 profilemanger.connect()函數,在這個函數裡調用了BluetoothA2dpService的connectSink()函數,最後調到Native方法connectSinkNative()去建立連接。


涉及到的一些類:


CachedBluetoothDevice(搜索到的設備)


BluetoothDevice(設備類)


LocalBluetoothProfileManager(各種ProfileManger,具現化各種Profile的service)


SettingsBtStatus(藍牙的狀態類)


BluetoothA2dp(為LocalBluetoothProfileManager和BluetoothA2dpService建立映射關係)


BluetoothA2dpService(最終的服務類,由它調用連接、斷開等Native函數,和底層通信)
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()