当前位置:首页 » JAVA技术教程

安卓自带示例BluetoothChat详解

2014-06-28 19:10 本站整理 浏览(359)

安卓自带示例BluetoothChat详解,有需要的朋友可以参考下。

安装好安卓SDK后,新建安卓项目会有一个Android Sample Project的选项,里面都是安卓自带的示例项目,其中BluetoothChat是利用蓝牙进行通信的实例。

一、首先介绍BluetoothChat的类结构

BluetoothChat项目src下共有三个类,分别为BluetoothChat、BluetoothChatService和DeviceListActivity类。下面介绍软件运行时各类所完成的动作。

1、BluetoothChat是主窗体,通俗来讲就是程序刚刚运行时用户所见到的窗体。具体调用过程如下:

1)软件运行后首先调用该类的onCreate()函数,进行主窗体的初始化,包括设置标题、设置窗体、初始化蓝牙适配器(mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();)和判断本地蓝牙是否可用,若本机设备不支持蓝牙则退出程序。否则执行onStart()函数。

2)onStart()函数首先判断本地蓝牙是否打开(!mBluetoothAdapter.isEnabled()),若没有打开,则通过Intent发送REQUEST_ENABLE_BT消息给onActivityResult()函数,执行打开蓝牙的操作(Intent消息是安卓中不同窗体进行通信的桥梁),并且调用setupChat()函数;如果已经打开蓝牙,则直接执行setupChat()设置聊天的输入文本框、发送按钮以及输入键盘初始化、添加发送按钮的点击监听等工作。

3)若一切顺利,此时蓝牙处于打开状态,而想要与其他设备进行聊天通信必须进行设备配对。onOptionsItemSelected()函数用于实现设备配对选项,当用户点击手机的menu按钮时就会调用这一函数。该函数有两个分支,其一是scan,其二是discoverable,当用户选择搜索设备时进入scan分支,通过Intent发送REQUEST_CONNECT_DEVICE消息给onActivityResult()函数,并且初始化DeviceListActivity类的对象,DeviceListActivity类即是src下的一个类,主要用于实现设备搜索窗体,显示已配对设备和搜索到的设备。onActivityResult()函数接下来会获得到已搜索到设备的MAC地址等信息,并且通过初始化BluetoothChatService类的对象mChatService来建立连接。

4)建立连接过程首先通过mChatService调用BluetoothChatService的成员函数connect()开始,此时操作主要集中于BluetoothChatService类内。connect()函数会通过mConnectThread = new ConnectThread(device)来创建一个connect线程。

5)步骤4)中会调用ConnectThread线程的构造函数,在其构造函数中会通过tmp = device.createRfcommSocketToServiceRecord(MY_UUID)创建一个客户端socket以便进行通信,并且在构造函数执行完返回后通过start()函数执行ConnectThread线程的run()函数。

6)ConnectThread::run()函数会调用mmSocket.connect()发起连接请求,并且在之后调用BluetoothChatService::start()函数来开启AcceptThread线程。start()函数是BluetoothChatService的成员函数,线程开启是通过mAcceptThread = new AcceptThread()实现的。

7)步骤6)中会调用AcceptThread的构造函数,通过tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID)来创建一个服务器socket,并且在之后调用AcceptThread线程的run()函数。

8)AcceptThread::run()函数通过一个while循环不断接受连接请求,且在有接受了一个连接后通过BluetoothChatService::connected()函数建立connected线程。connected()函数会启动一个ConnectedThread线程,该线程用于设置socket的输入输出流。

9)步骤8)中会调用ConnectedThread的构造函数,创建socket的输入输出流,并且接下来执行ConnectedThread::run()函数,run()函数通过一个while死循环不断从输入流中读取数据,用于接收配对设备发来的信息,并且通过Handler进行线程与主窗体之间的通信,将接受到的信息显示在主窗体上。

2、主要的数据通信过程已经分析完,另外还有点击发送按钮发送消息时的具体调用过程。在BluetoothChat类中的setupChat()函数中添加了点击发送按钮时的监听,当点击后会调用sendMessage()函数。sendMessage()函数首先检查连接是否建立,如果建立了连接,则通过BluetoothChatService的对象mChatService调用write()函数将消息写到输出流,相应的,由于对方设备在不断接收消息,该输出流的消息会被对方捕获并且显示。