手游的雙人對戰實現方式有很多,比如:
聯網對戰(需要一個服務器負責轉發客戶端請求,各種大型手游的做法)
分屏對戰(手機上下分屏,典型的例子就是切水果的雙人對戰)
藍牙聯機對戰(通過藍牙聯機,典型的例子是三國Kill聯機版)
首先,聯網對戰不考慮(成本高,服務器貴..),而分屏對戰局限性太大(兩個人用一個手機玩,太不方便了)
所以藍牙聯機對戰是不錯的選擇,低成本,可實現(三國Kill就是最好的例子,至少證明了這是可行的)
一.資源搜集
搜索“安卓開發藍牙聯機”,找到很多有用的信息,經過篩選發現大多信息都是與BluetoothChat有關的,了解後發現BluetoothChat是一個官方Demo,這就好辦了
先把源碼down過來,又順便找到了前輩的源碼解析,省了好多事兒,簡單整理了一下,資源如下:(前兩個來自網絡,後兩個是新鮮出爐的)
官方Demo源碼
前輩的源碼解析 pdf預覽
apk文件(適用於2.3.5到4.2.2)
含詳細注釋的源碼
二.Demo測試
拿到Demo先確定可以用:
導入Eclipse,出現紅叉叉,修改AndroidManifest.xml中的SDK版本,紅叉叉沒了
連接手機,安裝運行,程序異常終止,檢查Log,錯誤信息為you can not combine custom titles with other title
最後更改資源文件解決了這個問題,問題詳細及解決方案如下:
測試成功,真機聯機聊天沒問題
使用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標簽並設置為上面的值
真機運行效果如下:
三.藍牙聯機過程
聲明藍牙相關權限(關於權限的詳細見前輩的源碼解析,不在此贅述)
獲取本機藍牙適配器(BluetoothAdapter是系統提供的藍牙接口,通過適配器操作本機藍牙)
掃描可連接的外部藍牙設備(通過接收藍牙模塊返回的廣播消息得到外部設備的相關信息)
獲取外部設備的MAC地址
通過MAC地址建立Socket連接(有了Socket連接就好辦了,下面的工作和一般的Socket聊天程序沒什麼區別了)
通過Socket連接收發消息
簡單的說,聯機過程就是上面幾個步驟,筆者對源碼進行理解分析後(參照了前輩的源碼解析),補充了更易讀的注釋,如:
四.總結
源碼分析是一件耗時耗力的事情,但如果有時間的話,這樣的付出絕對是值得的,比單純的copy-modify要好很多,在分析別人的代碼過程中,我們可以得到這些東西:
實現原理(比如用來實現功能的各個組件的分工、交互,而不只是簡單的了解代碼塊的功能)
編碼規范(比如一開始會很好奇為什麼要分方法,分類,分層...)
編碼風格(變量、方法、類、包的命名規則,縮進風格...)
小技巧/常識(比如為了避免發布前刪除調試信息的工作,可以定義一個標識變量表示處於調試階段,把所有輸出調試信息的代碼包裹在if塊中,發布前只需要把標識變量改為false即可)