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