資源描述:
《android 藍牙源碼分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、android藍牙源碼分析BluetoothService類中定義的Native方法都在android_server_BluetoothServer.cpp里建立jni調(diào)用一、開啟(BTTurnonTurnoff)(藍牙的打開關(guān)閉由類BluetoothEnabler控制。)1.由BluetoothEnabler控制界面操作,在其構(gòu)造函數(shù)里會先調(diào)用LocalBluetoothManager.getInstance(context)。2.然后在LocalBluetoothManager類的getInstance函數(shù)里會調(diào)用當(dāng)前類下的
2、init()函數(shù),該init()函數(shù)中通過BluetoothAdapter.getDefaultAdapter()獲得藍牙設(shè)備的句柄,如果當(dāng)前沒有藍牙設(shè)備則返回null。3.初始化完畢會監(jiān)聽checkbox的狀態(tài),當(dāng)觸發(fā)點擊checkbox會響應(yīng)onPreferenceChange方法,其中將調(diào)用LocalBluetoothManager.setBluetoothEnabled(enable)方法。而LocalBluetoothManager.setBluetoothEnabled(enable)方法,會調(diào)用mAdapter.e
3、nable()方法,enable()方法又會調(diào)用BluetoothService.enable()方法。其中,(1)打開(關(guān)閉)操作成功后會有一個異步事件ACTION_STATE_CHANGED返回,異步事件由類BluetoothEventRedirector控制(接收廣播,進行處理)。在收到ACTION_STATE_CHANGED異步事件后,還需要做update本地設(shè)備profile的事情,讀取上次關(guān)閉前搜索到的藍牙設(shè)備。(1.1)update本地設(shè)備profile的事情:?(1.2)讀取上次關(guān)閉前搜索到的藍牙設(shè)備:通過Loc
4、alBluetoothManager.setBluetoothStateInt(intstate)方法調(diào)到CachedBluetoothDeviceManager.onBluetoothStateChanged方法來讀取上次關(guān)閉之前搜索到device.(2)來開啟EnableThread線程,進行打開操作,藍牙的打開關(guān)閉屬于異步操作。ps:在啟動藍牙的時候,要注意的地方是不能正常啟動藍牙的情況,因為正常啟動的時候會返回BluetoothIntent.ENABLED_ACTION這個Intent,當(dāng)時當(dāng)啟動出現(xiàn)異常的時候是沒有In
5、tent返回的,android使用回調(diào)函數(shù)來解決這個問題。下面是在bluetoothdeviceservice.java里面enable((IBluetoothDeviceCallbackcallback)的過程:(以下代碼屬于較低版本的android源碼,與較高版本源碼中已有所不同,只作為參考...)001ViewCode002publicsynchronizedbooleanenable(IBluetoothDeviceCallbackcallback){003checkPermissionBluetoothAdmin();
6、004Log.d(TAG,"startenable!");005//AirplanemodecanpreventBluetoothradiofrombeingturnedon.006if(mIsAirplaneSensitive&&isAirplaneModeOn()){007returnfalse;008}009if(mIsEnabled){010returnfalse;011}012if(mEnableThread!=null&&mEnableThread.isAlive()){013returnfalse;014}015/
7、/主要的啟動過程是放在一個新起的線程里面,但是不管能不能啟動016//仍然返回了true017mEnableThread=newEnableThread(callback);018mEnableThread.start();019//020returntrue;021022}023024privateEnableThreadmEnableThread;025privateclassEnableThreadextendsThread{026privatefinalIBluetoothDeviceCallbackmEnableCal
8、lback;027publicEnableThread(IBluetoothDeviceCallbackcallback){028mEnableCallback=callback;029}030publicvoidrun(){031booleanres=enab