|
发表于 2008-6-15
|
|阅读模式
开启 mAcceptThread 线程 蓝牙4
* y) y0 |2 ?9 E& S
+ {6 M0 b& l2 v ]8 b5 R+ F- d5 }% L5 g: L. |
3 d7 S) w4 `# M2 v+ L3 U& P3 V8 r 开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。! z7 R! o) G" P) ^4 _
: m* g {. j! r9 |7 j7 H3 n, C; B% \
public synchronized void connect(BluetoothDevice device) :
# N- N, ]& l. K) b1 h% A$ x+ E: q* w, ]) X1 b- z
取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。5 @! U# X1 g9 i+ |9 T3 p
& A$ z! v, `+ {% U
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :3 q- _% [" w2 } }% T# `
, C8 D, t0 g. s( ?& D* k0 C3 j+ c
开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。
0 r/ A- n# ^. G4 Q; v& M) c
" g# i# V. } L6 A3 b( V public synchronized void stop() :
6 V0 o7 H h, Q$ j) q
% g7 J& Y4 i$ i 停止所有相关线程,设当前状态为 NONE 。; y6 | Q l. \% ]/ p2 H
$ G1 Z: ^7 m4 n3 Z9 V+ P public void write(byte〔〕 out) :
) O7 C5 O/ E8 f+ M$ _6 V3 `, e% Y
, D, H1 n l1 `! [' z) t/ N/ B, T 在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。4 u# u# p& v- \2 B
7 M' Z, B) g, Q' W7 Z8 j private void connectionFailed() :
3 I+ }) Q2 |( ?0 U# O) G4 }& p/ D3 S; d
连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
" \2 a- \4 U- [, W$ q& C% _% o
5 Y7 W5 H4 d3 I private void connectionLost() :
4 R: O+ M, D9 q: \
* O9 p O) ?! @ D- l0 t 当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。0 x" Y9 B& _4 r8 |2 @
! [ Y; a8 A( I0 N5 Q* e 内部类:, N0 \2 y) o# ^ s- T
2 P* Y/ X8 ^/ W a: K
private class AcceptThread extends Thread :
% O' c8 u, u- l9 c& p8 ^% m; c0 l5 b! _0 v( y. Y! Z
创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
% R& r/ M! ~7 u' p
- \8 R3 U9 ]+ U3 z$ F$ {, I private class ConnectThread extends Thread :
7 k! s- s: }" S; C& `5 \
) z- E: K# q3 b+ D 这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。$ Z, n. f# ]+ w" f( v* V
2 X8 r, I* T2 t: n+ Y9 _% @: I8 l
private class ConnectedThread extends Thread :* Q3 e b" i1 w
9 g& ^3 d7 W l" G4 N$ c9 d: F( d
这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。
, V2 I s7 @( a" l0 V1 G# x! \
9 c& N9 D U4 y( O/ R: H& S6 m; @ 3.4. DeviceListActivity.java
# g. t. i R4 K# B( G8 j |: @
( @/ l5 y3 h! l/ ?, k 该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。
L' G0 D- H4 g; d J$ v% ~
* Y/ V0 _+ B% U q2 d6 r( p* y 除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。 |
|