代码流程分析二:Settings-蓝牙分析-加载界面

来源:互联网 发布:绿色贸易壁垒的数据 编辑:程序博客网 时间:2024/05/22 10:54

一:流程图已经分析

蓝牙界面上来的流程图




二:代码的分析:


BluetoothSettings类分析


由前面分析可以推出---->该类相当于继承了PreferenceFragment


这种类的流程是:

  • 构造方法----->onCreate()----->onCreateView()------>onActivityCreated()------->onResume()---->onPause。

  • 构造---->onCreate()------>addPreferencesForActivity()----->onCreateView()------>onActivityCreated()------->onResume()---->onPause。因为这个类继承了DeviceListPreferenceFragment它中是一个抽象方法abstract void addPreferencesForActivity();被onCreate()它调用。

点击事件的流程:
--------------->switch点击事件就是:
--------------->我的device点击事件
--------------->可用的device点击事件
--------------->已经配对的device点击事件
--------------->菜单的点击事件下面分析了
菜单事件的流程:
-------------->在onCreateOptionsMenu方法中
  • 知识添加了菜单,有的菜单设置了显示,有的设置永不显示,还可以设置有位置才显示。多了个.setEnabled()可不可以编辑。其他的没什么了
-------------->在onOptionsItemSelected()方法中设置每个菜单的点击事件。注意在蓝牙关的时候有3菜单enable是false,第一个搜索的时候会变为不能编辑也是false
查询:startScanning();
重命名手机:BluetoothNameDialogFragment().show( getFragmentManager(), "rename device");弹出对话框
检测超时设置:BluetoothVisibilityTimeoutFragment().show( getFragmentManager(), "visibility timeout");选择时间
显示接收到的文件:Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES);getActivity().sendBroadcast(intent);发一个广播
以配对的蓝牙设备:显示一个对话框


创建的流程:
-------------->在构造方法中

  • 一个intent过滤器,用来注册广播接受着,看设备的名字是不是改变了mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);

-------------->在onCreateView()中

  • 解析xml文件addPreferencesFromResource(R.xml.bluetooth_settings);这个xml文件是一个preferencesgreen的xml前面有介绍,又将另外一个xml实例化里面一个textView控件。

-------------->addPreferencesForActivity()

  • 在actionBar上实例化switch控件相当于代码的方式添加上去。Switch actionBarSwitch = new Switch(activity);
  • 同时将这个switch交给BluetoothEnable来管理。mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);目的是1:获得BluetoothAdapter,添加一个2:BluetoothAdapter.ACTION_STATE_CHANGED动作。
  • 菜单直接上来就能用 。setHasOptionsMenu(true);

--------------->onActivityCreated()这个方法中

  • 做一个标记看看是不是第一次连接设备。mActivityStarted = (savedInstanceState == null);
  • 将listView设置默认显示控件是刚才实例化的那个textView。getListView().setEmptyView(mEmptyView);有个疑问为什么不是继承listActivity也能用getListView()方法。
--------------->onResume()

  • 执行BluetoothEnable.resume()方法:相当于执行BluetoothEnable的构造方法和resume方法。通过现在蓝牙适配器获得蓝牙的状态/附加状态给switch组件设置状态。
  • 执行mDiscoverableEnabler.resume()方法:看扫描模式是不是新的,设置点击事件,然后将prefrence里面的内容catery更新。

  • 注册广播接收者接收到BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED这个动作,设备名字变了,要更改名字。mMyDevicePreference.setTitle(mLocalAdapter.getName());第一条preference设置标题是设备的名字。

  • 执行updateContent()这个方法:会显示4种状态,蓝牙开着,蓝牙正在打开,蓝牙关闭,蓝牙正在关闭。

  1. 先添加自己的设备:mMyDevicePreference = new Preference(getActivity());创建空的,设置各种属性图标(分为phone和 tablets, etc.),设备名字(在prefrence里面的),可不可以编辑,最后添加preferenceScreen.addPreference(mMyDevicePreference)。因为这个是始终在的,下面的有可能没有。
  2. 然后有个判断if (!isRestrictedAndNotPinProtected())应该是不受限制的情况下,将我前面的自己的蓝牙设备交给BluetoothDiscoverableEnabler来处理更新执行resume方法。
  3. 在添加已经配对的设备:mPairedDevicesCategory = new PreferenceCategory(getActivity());创建的是这种的看看前面知识点。最后添加addDeviceCategory()在这个方法中可以看到也是设置图标,添加,调用父类的一些方法(分析出怎么设置上去的)。然后得到配对设备数量,将配对设备数量添加到mDiscoverableEnabler.setNumberOfPairedDevices(numberOfPairedDevices);这个为了显示最上面的那个内容
  4. 在添加可以用的设备:mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity(), null);创建的是这种的看看前面知识点。最后添加addDeviceCategory()也是同理的也获取了数量。不同的是没有后面添加数量DiscoverableEnabler。
  5. 如果可用设备preference里面为0,移除。如果配对设备preference里面是0,移除之后是第一次开始查询设备。不是第一次,将可以连接的设备添加进来。问题是查询的方法感觉不对啊后面有分析。
  6. 菜单menu可以使用。

补充分析:
startScanning() 查询设备方法:
mLocalAdapter.startScanning(true);---->LocalBluetoothAdapter这个类的
void startScanning(boolean force) {        // Only start if we're not already scanning        if (!mAdapter.isDiscovering()) {            if (!force) {                // Don't scan more than frequently than SCAN_EXPIRATION_MS,                // unless forced                if (mLastScan + SCAN_EXPIRATION_MS > System.currentTimeMillis()) {                    return;                }                // If we are playing music, don't scan unless forced.                A2dpProfile a2dp = mProfileManager.getA2dpProfile();                if (a2dp != null && a2dp.isA2dpPlaying()) {                    return;                }            }            if (mAdapter.startDiscovery()) {                mLastScan = System.currentTimeMillis();            }        }

1.在BluetoothSetting里触发点击,调用LocalBluetoothManager.startScanning(true)函数,通过BluetoothAdapter的startDiscovery调用到BluetoothService里的startDiscovery来调用Native函数 startDiscoveryNative()。 startDiscovery()是个异步函数,会立即返回,通过注册 ACTION_DISCOVERY_STARTED、ACTION_DISCOVERY_FINISHED、ACTION_FOUND,来确定当前的状态。 当蓝牙由disable变成enable时会调用扫描,当距离上次扫描超过5分钟的前提下,退出页面,再进到页面的时候也会启动扫描。 在启动scan的时候,还会判断当前是否在播放音乐,如果在播放音乐,则不启动扫描。 点击查找设备后,会把设备列表里没有配对的设备清除掉,保留配对状态的设备。扫描的过程是一个很耗费资源的过程,在扫描过程,不会去尝试进行新的连接,扫描时间默认是12秒,它是以一个系统服务的形式存在的,可以调用cancelDiscovery()来取消扫描。 



再分析下刚才那个是怎么设置上去的图标,名字,连接不连接。
蓝牙开着:



蓝牙正在打开:BluetoothAdapter.STATE_TURNING_ON设置内容



蓝牙关闭:BluetoothAdapter.STATE_OFF设置内容


蓝牙正在关闭:BluetoothAdapter.STATE_TURNING_OFF:设置内容







--------------->onPause()
交给广播接受者看设备名字是不是改变了。
mBluetoothEnabler.pause()主要是switch组件不能点击。
mDiscoverableEnabler.pause();移除消息更新我自己设备界面的,注册广播,这个preference不能点击。

每次进来的流程:都要检查蓝牙的状态LocalBluetoothAdapter中的syncBluetoothState

--------------->onResume()


-----------------------------------------------------------------------------------------------------

------------------------->BluetoothEventManager中的AdapterStateChangedHandler(实际就是个广播接收者)接收到了adapter改变状态的通知------>AdapterStateChangedHandler(消息接收者)接到了状态是12,给它设状态是12------------>LocalBluetoothAdapter中的setBluetoothStateInt,因为调用了一个接口中的函数所以走--->callback.onBluetoothStateChanged(state);子类方法-->父类onBluetoothStateChanged(state)方法--->设完状态后执行mDeviceManager.onBluetoothStateChanged(state);相当于走这个类中的CachedBluetoothDeviceManager方法。------->BluetoothEnabler中最下面还有一个方法syncBluetoothState。也没发现状态值变。然后走g获得localBletoothManager实例--------->会再看状态值有没有变,------------>然后回到bluetoothSettings中的update更新信息方法,每次进来都要更新界面,getBluetoothState方法就是判断现在adapter的状态值的。

0 0
原创粉丝点击