Android4.42-Settings原始碼分析之藍芽模組Bluetooth總體實現(總)

來源:互聯網
上載者:User

標籤:string   gets   system   article   rac   screen   cal   man   調用   

本文為博主原創,轉載請註明出處:http://blog.csdn.net/zrf1335348191/article/details/50995466

藍芽相關代碼已在另兩篇文章中介紹,有須要的能夠查看

Android4.42-Settings原始碼分析之藍芽模組Bluetooth(上)

Android4.42-Setting原始碼分析之藍芽模組Bluetooth(下)


ONE,SWITCH藍芽開關

switch從建立到動作狀態監聽步驟例如以下

  • 建立switch執行個體

Switch actionBarSwitch = new Switch(activity);

  • 將執行個體加入到actionbar

activity.getActionBar().setCustomView(............);


  • 通過構造方法將switch執行個體傳遞給BluetoothEnabler執行個體

mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);

  • 在fragment中調用加入菜單的方法

setHasOptionsMenu(true);

  • 在onResume方法中對BluetoothEnabler的執行個體調用resume方法

以上一系列的代碼都是在BluetoothSettings.java中完畢,接下來就是在BluetoothEnabler.java中進行處理

  • 推斷藍芽是否可用,不可用就把switch設定成不可點擊
  • 依據本地藍芽狀態來更新switch狀態
  • 注冊過濾BluetoothAdapter.ACTION_STATE_CHANGE的廣播。當藍芽狀態發生變化時更新switch狀態
  • 為switch加入監聽事件,更改本地藍芽適配器,當本地藍芽適配器發生改變後更新switch狀態

總結,switch相關的邏輯實現就這些。在BluetoothSettings中建立switch執行個體,在BluetoothEnabler.java中對switch的狀態監聽及更新,查看代碼不難發現BluetoothEnabler.java類中是專門對switch進行處理的類。


TWO。本地藍芽相關
  • 建立本地藍芽的preference

mMyDevicePreference = new Preference(getActivity());

  • 顯示到螢幕

preferenceScreen.addPreference(mMyDevicePreference);

  • 構造BluetoothDiscoverableEnabler的執行個體對mMyDevicePreference的副標題summary進行顯示更新

mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),                                mLocalAdapter, mMyDevicePreference);                        mDiscoverableEnabler.resume();

以上代碼是在BluetoothSettings中完畢。preference包含title--藍芽名稱、summary---藍芽可檢測性的更新

藍芽名稱--title的更新過程在BluetoothSettings.java中完畢,步驟例如以下

  • 擷取到本機藍芽名稱

mMyDevicePreference.setTitle(mLocalAdapter.getName());

  • 對藍芽進行重新命名操作時彈出對話方塊進行處理

new BluetoothNameDialogFragment().show(                        getFragmentManager(), "rename device");

在BluetoothNameDialogFragment.java中監聽對話方塊中的編輯框。假設被編輯就改動本地藍芽的名稱,該類專用於為本機藍芽重新命名。

mLocalAdapter.setName();

在當前的activity彈出對話方塊消失後程式不會運行onResume方法。所以在BluetoothSettings.java中注冊廣播

  • 當本地藍芽名稱改變後會發送BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED的廣播。BluetoothSettings.java監聽到廣播後對mMyDevicePreference的title進行更新

藍芽可檢測性---summary的更新顯示

對於summary的顯示更新的操作在BluetoothDiscoverableEnabler.java中完畢,該類專用於更新summary以及處理mMyDevicePreference的點擊事件

  • 注冊廣播監聽藍芽掃描狀態的改變,當藍芽掃描狀態發生改變時會發送BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE廣播。對summary進行更新顯示。調用第三步的方法
  • 為preference設定點擊監聽,更改掃描狀態
  • 依據本地藍芽的掃描狀態來顯示summary

在顯示summary時有兩種情況,

       i>。假設本地藍芽既能夠掃描又能夠被檢測到即處於SCAN_MODE_CONNECTABLE_DISCOVERABLE狀態時。則依據可檢測性時間的長短來顯示,顯示內容為:附近全部裝置能夠檢測到+timeout

       ii>,假設是別的狀態,則要依據是否已經有已配對的裝置進行顯示,顯示為“已配對裝置可見”或者是“對全部裝置不可見”

既然說到了可檢測性。直接說一說可檢測時間,在程式啟動時注冊了廣播BluetoothDiscoverableTimeoutReceiver,當可檢測時間結束後就會將藍芽的掃描狀態設定為BluetoothAdapter.SCAN_MODE_CONNECTABLE,即取消對全部裝置的可檢測性

localBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
當設定了可檢測性為固定的一段時間後則會設定一個鬧鐘,用於觸發廣播,當所規定的時間到達時會觸發廣播。將手機藍芽的可檢測性關閉,假設想要永久的能夠被檢測到。則僅僅需講鬧鐘取消掉,不再觸發廣播就可以

Intent intent = new Intent(INTENT_DISCOVERABLE_TIMEOUT);        intent.setClass(context, BluetoothDiscoverableTimeoutReceiver.class);        PendingIntent pending = PendingIntent.getBroadcast(            context, 0, intent, 0);        AlarmManager alarmManager =              (AlarmManager) context.getSystemService (Context.ALARM_SERVICE);        if (pending != null) {            // Cancel any previous alarms that do the same thing.            alarmManager.cancel(pending);            Log.d(TAG, "setDiscoverableAlarm(): cancel prev alarm");        }        pending = PendingIntent.getBroadcast(            context, 0, intent, 0);        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pending);

對於可檢測性時間到達時對藍芽可檢測性的設定在BluetoothDiscoverableTimeoutReceiver.java中。該類為廣播組件。專門用於開啟或者關閉可檢測性的鬧鐘計時、關閉可檢測性。


THREE,裝置列表相關

加入已配對設別列表

  • 建立PreferenceCategory類型可配對裝置列表對象mPairedDevicesCategory

mPairedDevicesCategory = new PreferenceCategory(getActivity());

  • 加入可配對裝置列表mPairedDevicesCategory

addDeviceCategory(mPairedDevicesCategory,                        R.string.bluetooth_preference_paired_devices,                        BluetoothDeviceFilter.BONDED_DEVICE_FILTER);


  • 調用例如以下方法將可配對裝置列表傳遞給DeviceListPreferenceFragment進行管理

setDeviceListGroup(preferenceGroup);

以上代碼在BluetoothSettings中完畢,接下來在DeviceListPreferenceFragment中對列表進行管理

  • 擷取到裝置緩衝列表,該列表中存放已配對設裝置和未配對裝置,在程式成功安裝後會通過BluetoothAdapter的getBondedDevices方法讀取到已配對裝置儲存到緩衝列表中
  • 為列表加入已配對的裝置,所加入的對象為BluetoothDevicePreference構造的preference,也就是說單個裝置的preference的管理在BluetoothDevicePreference中

加入附近可用裝置列表

  • 點擊掃描附近可用裝置
  • 將附近可用裝置列表顯示到螢幕

getPreferenceScreen().addPreference(mAvailableDevicesCategory);

  • 掃描到裝置後緩衝到緩衝列表,然後顯示到附近可用裝置列表
  • 若附近可用裝置列表為空白,則移除

裝置的點擊事件在BluetoothDevicePreference中處理。裝置狀態不同則動作不同:假設是已配對裝置則點擊後就進行串連。假設是為配對的裝置點擊後進行配對。假設是已串連的裝置點擊後中斷連線。



Android4.42-Settings原始碼分析之藍芽模組Bluetooth總體實現(總)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.