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

原创 2015年07月09日 16:27:44

一:流程图已经分析

蓝牙界面上来的流程图




二:代码的分析:


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的状态值的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 7.0Settings加载主界面流程

新人一枚,没有整机环境,有什么写的不对欢迎批评指正,万分感谢! Settings主界面加载时序图(这里很多判断逻辑我省略掉了。更多的是想把加载主界面流程跑通。) 这张流程图将主fragm...

Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析

主入口为com.android.settings.Settings. 这只是一个wrapper的类, 它继承于 SettingsActivity类,并且声明了一堆公有的继承于SettingsActiv...

菜鸟android4.0 Settings分析(二) 界面修改

项目需要修改4.0的settings,先写点界面修改部分的实现吧 一、上面的分页tab android3.0以后就加入了ActionBar,上面的那条是...

菜鸟android4.0 Settings分析(二) 界面修改

项目需要修改4.0的settings,先写点界面修改部分的实现吧 一、上面的分页tab android3.0以后就加入了ActionBar,上面的那条是一个ActionBa...

菜鸟android4.0 Settings分析(二) 界面修改

项目需要修改4.0的settings,先写点界面修改部分的实现吧 一、上面的分页tab android3.0以后就加入了ActionBar,上面的那条是一个ActionBa...

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

ImageLoader类中包含了所有操作。他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法。在使用ImageLoader来显示图片之前,你需要初始化它的配置-Image...

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西。看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制。...

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

从UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)中,我们学习了Android-Universal-Image-Loader(以下简称UIL)中...

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

从UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)中,我们学习了Android-Universal-Image-Loader(以下简称UIL)中...

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:and...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)