Android 設計-3 藍牙

設計藍牙函數

設計藍牙函數

終於回到主題,藍牙的設計, 藍牙的牙到底要不要草字頭, 藍芽? who care? 反正我講的就是 Bluetooth。 我相信大家都有看過 Android 的標準範例 BluetoothChat。沒看過的,自己去找一下。

大致解說一下: BluetoothChat 就是啟動 非對稱 雙方溝通的藍牙,也就是兩台藍牙之間訊息的溝通, 不必要等對方的訊息才能打下一段的文字,收訊息與發訊息不需要等待。

  1. 在 BluetoothChatFragment 的 onCreate() 先確定是否有藍牙設備。

  2. 在 onStart() 裡面請求 Android 系統啟動 是否開啟藍牙 的指令 Intent。

  3. 確認開啟與否 REQUEST_ENABLE_BT 要求 Android 系統傳回 onActivityResult()。

  4. 如果確定 Activity.RESULT_OK 就 setupChat(), 或是 onResume() 啟動 mChatService()。

  5. 重點在 BluetoothChatService 採用 Thread,同時避免資料亂掉還加上 synchronized。

好了,講完了。你要自己去研究一下 BluetoothChat 範例的原始程式。

我們首先要先了解,我們的需求。我們用藍牙傳輸的方式是對 OBD dongle 連接器做運作,我們的指令是 一個口令一個動作,也就是說 Android 手機下 OBD 的指令,要等待連接器的訊息回傳。所以上面的 5,要改寫。

第二,Bluetooth 的 initialize。範例裡面動用了兩個程序。onCreate() 及 onStart()。 可以合在一起產生一個檔案嗎?

Android Activity 的生命週期

diag a89c5cd012e36bcd82062a0ba02a0fc0

Fragment 更細,不過還是衍生自 Activity 的行為,所以我們用 Activity 來討論就可以。 既然onCreate() 是建立藍圖的階段,onStart()是啟動階段。那可不可以把 REQUEST_ENABLE_BT 的行為放到 onStart()? 答案是 當然可以。所以對於 Activity 及 Fragment 的生命週期,你必須稍微了解一下。

回頭去看先前的兩篇文章,對於 Bluetooth 我們只有簡單的兩個程式, 一個是 RequestEnable, 一個是 BluetoothService。

public class RequestEnable implements RequestCode {

  public boolean enableIntent(Activity activity) {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    if (bluetoothAdapter == null) {
      Toast.makeText(activity, R.string.no_bluetooth, Toast.LENGTH_LONG).show();
      return false;
    }

    if (!bluetoothAdapter.isEnabled()) {
      Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

      activity.startActivityForResult(intent, REQUEST_ENABLE_BT);
    }
    return true;
  }
}

這樣就完成了一個 API Enable 啟動的動作。那 RequestCode 是什麼,沒什麼,只是一堆的 Constant 常數值, 等阿貝有空傳上 Github。如果你有找過 Github 上面其他的 BT API 做參考,你就會發現,怎麼單一個 BT enable 越寫越複雜, 搞的越來越模糊,那我跟你說,是你對 Android 的 lifecycle 不了解,結果就越來越不清楚 Android 在做什麼。

我們所受的訓練,是要把複雜的做簡單化; 而不是簡單的東西把它弄的更複雜。

flow.png

留言

這個網誌中的熱門文章

機車頭燈自動開關裝置

CRV 變速箱油-煞車油-濾芯-中型保養(二)

迅光化油器調整