蓝牙聊天 第5节 界面使用ConnectionManager

第5节 界面使用ConnectionManager

ConnectionManager已经设计完成了,它的价值需要在ChatActivity中体现出来。

5.1 监听ConnectionManager

实现对ConnectionManager各个状态的监听,当ConnectionManager的状态有变化、收到发送的数据时,需要让ChatActivity知道,它才能将各种变化反应到用户界面上。

5.1.1 创建监听器

ConnectionManager定义了ConnectionListener接口,状态变化、数据的接收可以通过这个接口获得。创建一个ConnectionListener监听器,

5.1.2 创建Handler

因为监听器触发的函数不一定是在UI线程被调用的,例如onConnectStateChange(),所以不能在监听器当中对界面做修改,必须把界面更新的任务交给UI线程进行。

安卓系统提供了Handler的机制,让其它非UI线程能通过Handler把界面更新的操作,从工作线程布置给主线程完成。

  1. 创建一个能在主线程当中工作的Handler,

  2. ConnectionManager通知的内容,转交给主线程的Handler处理,

  3. 创建ConnectionManager,添加监听,

5.2 启动与停止监听

当聊天应用运行起来的时候,需要开启对其它蓝牙设备可能接入的监听,

当应用退出的时候,要断开可能存在的连接并停止监听,

5.3 启动连接

5.3.1 通过选择设备主动连接

当用户点击菜单栏的启动连接菜单项时,会启动DeviceListActivity,让用户从刷新的列表中,选取一个希望连接的设备。用户选择后,会把选中设备的地址返回给ChatActivity

这样,就可以利用ConnectionManager发起主动连接的请求了,

之后,ConnectionManager的各种状态变化,就会通过监听器ConnectionListener,传递到ChatActivity当中,据此更新界面就好了。

5.3.2 通过监听被动连接

这种情况,并不需要用户去做任何点击的操作。
之后,ConnectionManager的各种状态变化,就会通过监听器ConnectionListener,传递到ChatActivity当中,据此更新界面就好了。

5.3.3 菜单项的改变

我们之前已经通过ChatActivityonCreateOptionsMenu()方法,把菜单项添加到了菜单栏。现在需要菜单项随着ConnectionManager状态的变化,跟着做变化了。

  1. 当监听器的onConnectStateChange()或者onListenStateChange被触发后,我们将变化通过Handler通知到了UI线程,

    在更新UI到方法updateUI()中,修改菜单项的显示,

  2. 菜单项的响应也需要根据当前的连接状态,做进一步的修改,

5.4 发送与显示数据

聊天文字发送成功或者接收到对方发来的文字时,要显示到列表中。为此,我们需要专门设计一个Adapter来展示它们。

5.4.1 文字信息的数据结构

首先定义一个记录每条信息的数据结构ChatMessage,每一条消息要注明是由谁发来的,是自己还是对方,

5.4.2 信息展示的Adapter

我们采用类似微信聊天的样子来展示聊天内容。每条消息的背景图片是9patch形式的PNG图片,将它们放在res\drawable目录中。针对不同的屏幕像素密度,设计了对应的图片,放到对应的drawable目录下就行了。例如为xxhdip设计的背景图片就放在res\drawable-xxhdip目录中。

这些图片可以在示例代码中获得。

  1. 定义展示对方发来信息的布局-others_list_item.xml

  2. 定义展示自己发送信息的布局-me_list_item.xml

  3. 定义AdapterMessageAdapter,

  4. 使用聊天列表,

5.4.3 文字的发送

当连接建立以后,禁止点击的发送按钮和文字编辑框将被解禁。再文字编辑框中编辑好文字,点击发送按钮,就能将文字发送出去了。

  1. 为按钮创建监听器,当点击后,获取文字编辑框中的数据,再使用ConnectionManager提供的接口,把数据发送出去,

  2. 注册监听函数,

  3. ConnectionListeneronSendData回调方法中,将发送结果传递给UI线程,让UI线程把聊天内容更新到消息列表中,

5.4.4 文字的接收

当接收到对方发来的消息时,ConnectionListeneronReadData回调方法,将发送结果传递给UI线程,让UI线程把聊天内容更新到消息列表中,

至此,蓝牙聊天的整个流程都得以实现了。