蓝牙开关
BluetoothSettings
設置 選項中 藍牙開關的按鈕。在settings代碼中。
代碼路徑(packages\apps\Settings\src\com\android\settings\bluetooth\)
BluetoothSettings
//android8.0\packages\apps\Settings\src\com\android\settings\bluetooth\BluetoothSettings.javapublic final class BluetoothSettings extends DeviceListPreferenceFragment implements Indexable {... }這個類,是藍牙設置中的主界面。
我們通過這個類來完善對settings中藍牙相關代碼以及類的認識。
藍牙開關
我們分析一下藍牙開關按鈕都做了什么操作。
//android8.0\packages\apps\Settings\src\com\android\settings\bluetooth\BluetoothSettings.java@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);/* Don't auto start scan if screen reconstructs due to frozen screen*/mInitialScanStarted = (savedInstanceState != null);mInitiateDiscoverable = true;final SettingsActivity activity = (SettingsActivity) getActivity();mSwitchBar = activity.getSwitchBar();//打開開關mBluetoothEnabler = new BluetoothEnabler(activity, new SwitchBarController(mSwitchBar),mMetricsFeatureProvider, Utils.getLocalBtManager(activity),MetricsEvent.ACTION_BLUETOOTH_TOGGLE);mBluetoothEnabler.setupSwitchController();}BluetoothSettings.java是settings中藍牙相對比較重要的類。在初始化(onActivityCreated)的時候,進行打開開關操作。
調用BluetoothEnabler來開啟開關。
BluetoothEnabler構造方法
我們進入BluetoothEnabler的構造方法來看看都做了什么操作。
E:\android8.0\packages\apps\Settings\src\com\android\settings\bluetooth\BluetoothEnabler.javapublic BluetoothEnabler(Context context, SwitchWidgetController switchWidget,MetricsFeatureProvider metricsFeatureProvider, LocalBluetoothManager manager,int metricsEvent, RestrictionUtils restrictionUtils) {mContext = context;mMetricsFeatureProvider = metricsFeatureProvider;//ui選擇控件mSwitchWidget = switchWidget;mSwitch = mSwitchWidget.getSwitch();mSwitchWidget.setListener(this);mValidListener = false;mMetricsEvent = metricsEvent;if (manager == null) {// 藍牙不支持。通過判斷manager是否為空。mLocalAdapter = null;mSwitchWidget.setEnabled(false);} else {//1.1//支持藍牙的時候,是通過manager獲取.//這個manger是LocalBluetoothManager,這個類是為本地的藍牙接口適配器,為應用提供接口,同時調用BluetoothAdapter的接口,起到應用和底層的適配作用。mLocalAdapter = manager.getBluetoothAdapter();}mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);mRestrictionUtils = restrictionUtils;}1.1 LocalBluetoothManager
LocalBluetoothManager類將bluetooth api的接口封裝。
public class LocalBluetoothManager {private static final String TAG = "LocalBluetoothManager";/** Singleton instance. */private static LocalBluetoothManager sInstance;private final Context mContext;/** If a BT-related activity is in the foreground, this will be it. */private Context mForegroundActivity;private final LocalBluetoothAdapter mLocalAdapter;private final CachedBluetoothDeviceManager mCachedDeviceManager;/** The Bluetooth profile manager. */private final LocalBluetoothProfileManager mProfileManager;/** The broadcast receiver event manager. */private final BluetoothEventManager mEventManager;/**獲取一個示例*/public static synchronized LocalBluetoothManager getInstance(Context context,BluetoothManagerCallback onInitCallback) {if (sInstance == null) {LocalBluetoothAdapter adapter = LocalBluetoothAdapter.getInstance();if (adapter == null) {return null;}// This will be around as long as this process isContext appContext = context.getApplicationContext();sInstance = new LocalBluetoothManager(adapter, appContext);if (onInitCallback != null) {onInitCallback.onBluetoothManagerInitialized(appContext, sInstance);}}return sInstance;}//構造方法中new 了幾個相關的manager來得到getxxxmanager。private LocalBluetoothManager(LocalBluetoothAdapter adapter, Context context) {mContext = context;mLocalAdapter = adapter;//負責管理藍牙的緩存(已配對的設備和搜索到的設備)主要都保存在List<CachedBluetoothDevice> mCachedDevices中mCachedDeviceManager = new CachedBluetoothDeviceManager(context, this);//接收廣播,分發(fā)底層發(fā)出的event。一般android中定義eventxxx類其實就是傳遞的類。mEventManager = new BluetoothEventManager(mLocalAdapter,mCachedDeviceManager, context);//藍牙配置協(xié)議管理 例如A2dpProfile HeadsetProfile OppProfile PbapClientProfile有個印象即可。后續(xù)會進行詳細講解。mProfileManager = new LocalBluetoothProfileManager(context,mLocalAdapter, mCachedDeviceManager, mEventManager);}...}這個類的代碼很少,用一個單例模式。構造方法中new出3個相應的xxxmanager。并且提供了3個方法來獲取xxxmanager。
getCachedDeviceManager,getProfileManager,getEventManager。
獲取mLocalAdapter有什么用?
BluetoothEnabler的handleStateChanged方法
我們先看看bluetootheabler的的handleStateChanged方法
// BluetoothEnabler.javavoid handleStateChanged(int state) {switch (state) {case BluetoothAdapter.STATE_TURNING_ON:mSwitchWidget.setEnabled(false);break;case BluetoothAdapter.STATE_ON:setChecked(true);mSwitchWidget.setEnabled(true);break;case BluetoothAdapter.STATE_TURNING_OFF:mSwitchWidget.setEnabled(false);break;case BluetoothAdapter.STATE_OFF:setChecked(false);mSwitchWidget.setEnabled(true);break;default:setChecked(false);mSwitchWidget.setEnabled(true);}}這個方法在onresume中被調用
BluetoothEnabler.javapublic void resume(Context context) {if (mContext != context) {mContext = context;}maybeEnforceRestrictions();if (mLocalAdapter == null) {mSwitchWidget.setEnabled(false);return;}// Bluetooth state is not sticky, so set it manuallyhandleStateChanged(mLocalAdapter.getBluetoothState());mSwitchWidget.startListening();mContext.registerReceiver(mReceiver, mIntentFilter);mValidListener = true;}我們也就清楚了,進入這個bluetoothEnabler類后。onresume方法來進行獲取狀態(tài)。
傳入的參數(shù)是
mLocalAdapter.getBluetoothState()也就是我們之前分析的構造方法中 //1.1
//1.1 mLocalAdapter = manager.getBluetoothAdapter();的用處。
已配對設備,可用設備
藍牙打開后,會出現(xiàn)已經配對設備,可用設備。
//android8.0\packages\apps\Settings\src\com\android\settings\bluetooth\BluetoothSettings.java@Overridevoid addPreferencesForActivity() {addPreferencesFromResource(R.xml.bluetooth_settings);final Context prefContext = getPrefContext();//已經配對設備列表mPairedDevicesCategory = new PreferenceCategory(prefContext);mPairedDevicesCategory.setKey(KEY_PAIRED_DEVICES);mPairedDevicesCategory.setOrder(1);//可用設備列表getPreferenceScreen().addPreference(mPairedDevicesCategory);mAvailableDevicesCategory = new BluetoothProgressCategory(prefContext);mAvailableDevicesCategory.setSelectable(false);mAvailableDevicesCategory.setOrder(2);getPreferenceScreen().addPreference(mAvailableDevicesCategory);mMyDevicePreference = mFooterPreferenceMixin.createFooterPreference();mMyDevicePreference.setSelectable(false);setHasOptionsMenu(true);}總結
- 上一篇: 计算机的培训教案模板,计算机教学计划范例
- 下一篇: [UOJ449][概率DP]集训队作业2