setupChat中先对界面中的控件进行初始化增加点击监听器等,然创建BluetoothChatService对象,该对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。33BluetoothChatServicejavapublicsy
chro
izedvoidstart:开启mAcceptThread线程,由于样例程序是仅2人的聊天过程,故之前先检测mCo
ectThread和mCo
ectedThread是否运行,运行则先退出这些线程。publicsy
chro
izedvoidco
ectBluetoothDevicedevice:取消CONNECTING和CONNECTED状态下的相关线程,然后运行新的mCo
ectThread线程。publicsy
chro
izedvoidco
ectedBluetoothSocketsocketBluetoothDevicedevice:开启一个Co
ectedThread来管理对应的当前连接。之前先取消任意现存的mCo
ectThread、mCo
ectedThread、mAcceptThread线程,然后开启新mCo
ectedThread,传入当前刚刚接受的socket连接。最后通过Ha
dler来通知UI连接OK。publicsy
chro
izedvoidstop:停止所有相关线程,设当前状态为NONE。publicvoidwritebyteout:在STATE_CONNECTED状态下,调用mCo
ectedThread里的write方法,写入byte。
fprivatevoidco
ectio
Failed:连接失败的时候处理,通知ui,并设为STATE_LISTEN状态。privatevoidco
ectio
Lost:当连接失去的时候,设为STATE_LISTEN状态并通知ui。内部类:privateclassAcceptThreadexte
dsThread:创建监听线程,准备接受新连接。使用阻塞方式,调用BluetoothServerSocketaccept。提供ca
cel方法关闭socket。privateclassCo
ectThreadexte
dsThread:这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过BluetoothDevicecreateRfcommSocketToServiceRecord,从待连接的device产生BluetoothSocket然后在ru
方法中co
ect,成功后调用BluetoothChatSevice的co
ected方法。定义ca
cel在关闭线程时能够关闭相关socket。privateclassCo
ectedThreadexte
dsThread:这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。Ru
方法中使用阻塞模式的I
putStreamread循环读取输入流,然后post到UI线程中更新聊天消息。也提供了write将聊天消息写入输出流传输至对方,传输成功后回写入UI线程。最后ca
cel关闭连接的socket。34DeviceListActivityjava该类包含UI和操作的Activity类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。除了RFCOMM通信外,A
droid上关于Bluetooth的还有SDP、GAP、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关API在r