首先要了解藍(lán)牙,然后要知道藍(lán)牙是怎么工作的,下面是藍(lán)牙的工作流程:
1.發(fā)現(xiàn)周圍的藍(lán)牙設(shè)備
2.獲取發(fā)現(xiàn)設(shè)備的adress,根據(jù)adress得到遠(yuǎn)程設(shè)備的BluetoothDevice,然后創(chuàng)建BluetoothSocket,最后connect()
(1)BluetoothChat
例子的主Activity。onCreate()得到本地BluetoothAdapter設(shè)備,檢查是否支持。onStart()中檢查是否啟用藍(lán)牙,并請求啟用,然后執(zhí)行setupChat()。setupChat()中先對界面中的控件進(jìn)行初始化增加點(diǎn)擊監(jiān)聽器等,然創(chuàng)建BluetoothChatService對象,該對象在整個(gè)應(yīng)用過程中存在,并執(zhí)行藍(lán)牙連接建立、消息發(fā)送接受等實(shí)際的行為。
(2)BluetoothChatService
public synchronized void start():開啟mAcceptThread線程,由于樣例程序是僅2人的聊天過程,故之前先檢測mConnectThread和mConnectedThread是否運(yùn)行,運(yùn)行則先退出這些線程。
public synchronized voidconnect(BluetoothDevice device):取消CONNECTING和CONNECTED狀態(tài)下的相關(guān)線程,然后運(yùn)行新的mConnectThread線程。
public synchronized voidconnected(BluetoothSocket socket, BluetoothDevice device):開啟一個(gè)ConnectedThread來管理對應(yīng)的當(dāng)前連接。之前先取消任意現(xiàn)存的mConnectThread、mConnectedThread、mAcceptThread線程,然后開啟新mConnectedThread,傳入當(dāng)前剛剛接受的socket連接。最后通過Handler來通知UI連接OK。
public synchronized void stop():停止所有相關(guān)線程,設(shè)當(dāng)前狀態(tài)為NONE。
public void write(byte[] out):在STATE_CONNECTED狀態(tài)下,調(diào)用mConnectedThread里的write方法,寫入byte。
private void connectionFailed():連接失敗的時(shí)候處理,通知ui,并設(shè)為STATE_LISTEN狀態(tài)。
private void connectionLost():當(dāng)連接失去的時(shí)候,設(shè)為STATE_LISTEN狀態(tài)并通知ui。
內(nèi)部類:private class AcceptThread extendsThread:創(chuàng)建監(jiān)聽線程,準(zhǔn)備接受新連接。使用阻塞方式,調(diào)用BluetoothServerSocket.accept()。提供cancel方法關(guān)閉socket。
private class ConnectThread extendsThread:這是定義的連接線程,專門用來對外發(fā)出連接對方藍(lán)牙的請求和處理流程。構(gòu)造函數(shù)里通過BluetoothDevice.createRfcommSocketToServiceRecord(),從待連接的device產(chǎn)生BluetoothSocket.然后在run方法中connect,成功后調(diào)用BluetoothChatSevice的connected()方法。定義cancel()在關(guān)閉線程時(shí)能夠關(guān)閉相關(guān)socket。
private class ConnectedThread extendsThread:這個(gè)是雙方藍(lán)牙連接后一直運(yùn)行的線程。構(gòu)造函數(shù)中設(shè)置輸入輸出流。Run方法中使用阻塞模式的InputStream.read()循環(huán)讀取輸入流,然后post到UI線程中更新聊天消息。也提供了write()將聊天消息寫入輸出流傳輸至對方,傳輸成功后回寫入U(xiǎn)I線程。最后cancel()關(guān)閉連接的socket。
(3)DeviceListActivity
該類包含UI和操作的Activity類,作用是得到系統(tǒng)默認(rèn)藍(lán)牙設(shè)備的已配對設(shè)備列表,以及搜索出的未配對的新設(shè)備的列表。然后提供點(diǎn)擊后發(fā)出連接設(shè)備請求的功能。