|
开启 mAcceptThread 线程 蓝牙4
$ [5 `2 y$ R% U6 J6 p& ]( N3 Z; R
! P: n, [6 q: r. R) A
: h8 H8 t9 T, \1 Y0 Z9 h
开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
( S& C0 J% P2 y5 ?0 r+ G6 k& }1 t1 O# L5 }7 g! R
public synchronized void connect(BluetoothDevice device) :/ E5 F" S: B7 m: G' v
9 @: v. M* [# z) n" j 取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。
; ~$ W9 [* u1 Y- s/ M& b: v0 a) g# q/ t: g1 ~
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :/ u1 `0 d5 p. p+ G, t% [4 q" K! B
" x t9 i- m3 m
开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。
0 x% O# j- n1 r" c; ?8 Z3 D+ u4 X* n" G' R
public synchronized void stop() :
8 t& z+ f4 H/ c5 P5 e- H: \
6 U" E6 s9 Q" _5 u3 o 停止所有相关线程,设当前状态为 NONE 。
0 h1 q9 s" y) L- P
" g7 u1 W0 d V% V K0 [2 v public void write(byte〔〕 out) :
( s3 Z+ d9 k& A' V; p4 H# @$ {- ~
在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。
R6 E% z% Q$ }* ^3 l, h) z0 \/ t7 [) n$ P% Q
private void connectionFailed() :& M5 ^" q. g" p% S
b& V5 [. y' Y, w4 W/ k 连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
! O8 F* a4 m- D9 R! o
* A8 P A) ?# W/ c8 C private void connectionLost() :
. D+ v. m6 U+ w8 E' p* J6 q2 Z! }+ w i
当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。
7 @1 f5 p+ M1 d& t4 }# B5 l `; x$ {; Q! j& U$ m
内部类:
3 T9 X2 T& L p) v* J
+ ~+ I) V7 @6 X% f; d: {9 K private class AcceptThread extends Thread :
; D( U1 g2 E& {, x0 N. E
" \5 p# G( ?. \+ P) H% g* z 创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。3 M2 q1 P% j: }' u. `
* p+ H( l6 v j/ A. u3 R3 u private class ConnectThread extends Thread :
9 e# J$ b3 V+ _' r+ U6 m; W7 @) E% x( c
这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。
. [) u0 z8 F$ m! v1 r, M! S+ U
, A: _+ I" ^9 h) E2 t private class ConnectedThread extends Thread :* e, L2 H0 V! D, w; S5 T- T
7 e9 N# j$ H' ` 这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。; @5 @ q) `0 c, h
% e9 I1 K% \6 m+ b
3.4. DeviceListActivity.java
( B- ^6 G# ?( W) E. e8 R0 ]% s) h3 ~! A. d' x
该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。; Q% [6 e8 K& \/ b3 g& ^
* v9 w" d2 [2 \% ] 除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。 |
|