写在前面:

手游的双人对战实现方式有很多,比如:

  • 联网对战(需要一个服务器负责转发客户端请求,各种大型手游的做法)
  • 分屏对战(手机上下分屏,典型的例子就是切水果的双人对战)
  • 蓝牙联机对战(通过蓝牙联机,典型的例子是三国Kill联机版)

首先,联网对战不考虑(成本高,服务器贵..),而分屏对战局限性太大(两个人用一个手机玩,太不方便了)

所以蓝牙联机对战是不错的选择,低成本,可实现(三国Kill就是最好的例子,至少证明了这是可行的)

一.资源搜集

搜索“安卓开发蓝牙联机”,找到很多有用的信息,经过筛选发现大多信息都是与BluetoothChat有关的,了解后发现BluetoothChat是一个官方Demo,这就好办了

先把源码down过来,又顺便找到了前辈的源码解析,省了好多事儿,简单整理了一下,资源如下:(前两个来自网络,后两个是新鲜出炉的)

二.Demo测试

拿到Demo先确定可以用:

  1. 导入Eclipse,出现红叉叉,修改AndroidManifest.xml中的SDK版本,红叉叉没了
  2. 连接手机,安装运行,程序异常终止,检查Log,错误信息为you can not combine custom titles with other title
  3. 最后更改资源文件解决了这个问题,问题详细及解决方案如下:
  4. 测试成功,真机联机聊天没问题

使用Demo中可能遇到的问题:

  • you can not combine custom titles with other title错误原因以及怎么解决?
原因:xml里面定义的activity的theme和代码定义的theme不一致,即title样式冲突
解决方案:把xml里对应的activity里的theme改成@android:style/Theme
注意:如果xml里activity没有theme标签,应该添加theme标签并设置为上面的值

真机运行效果如下:



三.蓝牙联机过程

  1. 声明蓝牙相关权限(关于权限的详细见前辈的源码解析,不在此赘述)
  2. 获取本机蓝牙适配器(BluetoothAdapter是系统提供的蓝牙接口,通过适配器操作本机蓝牙)
  3. 扫描可连接的外部蓝牙设备(通过接收蓝牙模块返回的广播消息得到外部设备的相关信息)
  4. 获取外部设备的MAC地址
  5. 通过MAC地址建立Socket连接(有了Socket连接就好办了,下面的工作和一般的Socket聊天程序没什么区别了)
  6. 通过Socket连接收发消息

简单的说,联机过程就是上面几个步骤,笔者对源码进行理解分析后(参照了前辈的源码解析),补充了更易读的注释,如:

四.总结

源码分析是一件耗时耗力的事情,但如果有时间的话,这样的付出绝对是值得的,比单纯的copy-modify要好很多,在分析别人的代码过程中,我们可以得到这些东西:

  • 实现原理(比如用来实现功能的各个组件的分工、交互,而不只是简单的了解代码块的功能)
  • 编码规范(比如一开始会很好奇为什么要分方法,分类,分层...)
  • 编码风格(变量、方法、类、包的命名规则,缩进风格...)
  • 小技巧/常识(比如为了避免发布前删除调试信息的工作,可以定义一个标识变量表示处于调试阶段,把所有输出调试信息的代码包裹在if块中,发布前只需要把标识变量改为false即可)

Android蓝牙联机Demo解析的更多相关文章

  1. Android蓝牙开发深入解析

    1. 使用蓝牙的响应权限  代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /> ...

  2. Android -BLE蓝牙小DEMO

    代码地址如下:http://www.demodashi.com/demo/13890.html 原文地址: https://blog.csdn.net/vnanyesheshou/article/de ...

  3. Android蓝牙自动配对Demo,亲测好使!!!

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...

  4. Android蓝牙自动配对Demo,亲测好使!!!(转)

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...

  5. Android 蓝牙4.0 BLE

    Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profil ...

  6. android -- 蓝牙 bluetooth (三)搜索蓝牙

    接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...

  7. android -- 蓝牙 bluetooth (一) 入门

    前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2 ...

  8. 深入了解Android蓝牙Bluetooth——《基础篇》

    什么是蓝牙?   也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的.利用"蓝牙"技术,能够有效地简化掌上电脑.笔记本电 ...

  9. 深入了解Android蓝牙Bluetooth——《进阶篇》

    在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/6046846 ...

随机推荐

  1. 第八章 高级搜索树 (a2)伸展树:双层伸展

  2. 百度BAE部署微信开发环境

    这里会弹出一个SVN的账户和密码,这个账户和密码就是你百度的账户和密码 将项目导出WAR包到SVN的客户端目录里面 然后右键SVN Commit提交代码 部署列表有新版本 快捷发布 tocken认证失 ...

  3. UVa 10763 Foreign Exchange(map)

    Your non-profitorganization (iCORE - international Confederationof Revolver Enthusiasts) coordinates ...

  4. 两数之和-数据结构设计 · Two Sum - Data structure design

    [抄题]: 设计b并实现一个 TwoSum 类.他需要支持以下操作:add 和 find.add -把这个数添加到内部的数据结构.find -是否存在任意一对数字之和等于这个值 [思维问题]: 不知道 ...

  5. NSThread 在主线操作的三个方法

    - (void)createNSThread444{ UIImage *image = [UIImage imageNamed:@"图片名字"]; /** 1 performSel ...

  6. 《计算机网络》谢希仁(第7版) 第四章 c语言http://c.biancheng.net/cpp/html/3137.html

    第四章 网络层 电信网使用面向连接的通信方式,使电信网络能够向用户提供可靠传输的服务. 互联网设计思路:网络层向上只提供简单灵活的.无连接的.尽最大努力交付的数据报(分组)服务. 网络层不提供可靠传输 ...

  7. 767A Snacktower

    A. Snacktower time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  8. python使用input()来接受字符串时一直报错“xxx is not defined”

    报错信息: “Please input your guess: gussTraceback (most recent call last):  File "coinGuessGame.py& ...

  9. Ui设计流行趋势,对颜色的探讨

    设计风向转换的趋势越来越短,在设计圈中,流行设计的跟新换代更是快.在设计时间越来越短的今天,在经理领导不断催促的时下,如何准确的把握当下的流行趋势,如何在设计之初就能定好设计的基调.这对于还是刚入设计 ...

  10. LINUX网络编程 IO 复用

    参考<linux高性能服务器编程> LINUX下处理多个连接时候,仅仅使用多线程和原始socket函数,效率十分低下 于是就出现了selelct poll  epoll等IO复用函数. 这 ...