Google 提供的关于 Bluetooth 开发的例程为 Bluetoothchat。除去配置及 UI定义等文
件, 主程序文件共三个: BluetoothChat.java 、BluetoothChatService.java 以及
DeviceListActivity.java ,详细功能可见下面的描述。
1.BluetoothChat.java
例程的主 Activity 。 onCreate() 得到本地 BluetoothAdapter 设备,检查是否支持。
onStart() 中检查是否启用蓝牙,并请求启用,然后执行 setupChat()。setupChat() 中
先对界面中的控件进行初始化增加点击监听器等,然创建BluetoothChatService 对象,该
对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。
2.BluetoothChatService.java
public synchronized void start()
开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测
mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
public synchronized void connect(BluetoothDevice device) :
取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的mConnectThread 线程。
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :
开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的
mConnectThread 、 mConnectedThread 、 mAcceptThread 线程, 然后开启新
mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过Handler 来通知 UI
连接 OK 。
public synchronized void stop() :停止所有相关线程,设当前状态为NONE 。
public void write(byte[] out) : 在 STATE_CONNECTED 状态下, 调用
mConnectedThread 里的 write 方法,写入 byte 。
private void connectionFailed() :连接失败的时候处理,通知 ui ,并设为
STATE_LISTEN 状态。
private void connectionLost() :当连接失去的时候,设为 STATE_LISTEN状态并通
知 UI 。
内部类:
private class AcceptThread
用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
private class ConnectThread
外发出连接对方蓝牙的请求和处理流程。构造函数里通过
BluetoothDevice.createRfcommSocketToServiceRecord() , 从待连接的device 产生
BluetoothSocket. 然后在 run 方法中 connect ,成功后调用BluetoothChatSevice 的
connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。
private class ConnectedThread
的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的InputStream.read() 循
环读取输入流, 然后 post 到UI 线程中更新聊天消息。也提供了 write() 将聊天消息写
入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。
3.DeviceListActivity.java
该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列
表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。
BluetoothDevice 类,此为对应的远程蓝牙 Device
createRfcommSocketToServiceRecord() :创建该 Device 的 socket 。
BluetoothSocket 类
connect() :请求连接蓝牙。
getInputStream() :得到输入流,用于接收远程方信息。
getOutputStream() :得到输出流,发送给远程方的信息。
close() :关闭蓝牙连接。
InputStream 类:
read(byte[]) :以阻塞方式读取输入流。
OutputStream 类:
write(byte[]) :将信息写入该输出流,发送给远程。