Android藍牙聯機Demo解析

寫在前面:android

手遊的雙人對戰實現方式有不少,好比:服務器

  • 聯網對戰(須要一個服務器負責轉發客戶端請求,各類大型手遊的作法)
  • 分屏對戰(手機上下分屏,典型的例子就是切水果的雙人對戰)
  • 藍牙聯機對戰(經過藍牙聯機,典型的例子是三國Kill聯機版)

首先,聯網對戰不考慮(成本高,服務器貴..),而分屏對戰侷限性太大(兩我的用一個手機玩,太不方便了)網絡

因此藍牙聯機對戰是不錯的選擇,低成本,可實現(三國Kill就是最好的例子,至少證實了這是可行的)源碼分析

一.資源蒐集測試

搜索「安卓開發藍牙聯機」,找到不少有用的信息,通過篩選發現大多信息都是與BluetoothChat有關的,瞭解後發現BluetoothChat是一個官方Demo,這就好辦了編碼

先把源碼down過來,又順便找到了前輩的源碼解析,省了好多事兒,簡單整理了一下,資源以下:(前兩個來自網絡,後兩個是新鮮出爐的)調試

二.Demo測試xml

拿到Demo先肯定能夠用:blog

  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便可)
相關文章
相關標籤/搜索