代码流程分析二: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的状态值的。

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

代码流程分析二:Settings-蓝牙分析-搜索设备原理

一:BluetoothSettings中走onResume 二:相当于父类deviceListPreferenceFragment 中走onResume onCreate 三:LocalB...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月12日 19:24
  • 948

代码流程分析二:Settings-蓝牙分析-点击配对连接设备原理分析

蓝牙配对功能 配对手机,配对蓝牙耳机,配对电脑 (一)设置界面packages\Settings A:搜索调用的地方:点击preference因为下面的条目是单独的一个所以到了blueet...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月27日 15:29
  • 1491

代码流程分析二:Settings-蓝牙分析-switch开关分析

一:流程图已经分析 二:代码的分析: switch开关事件的流程: 准备工作: switch点击事件就是:点了开关可以显示不同的界面。 经过测试没有看到bluetoothEnable来控制...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月10日 12:03
  • 630

androoid framework学习之Settings的主界面的代码流程分析

今天开始学setting的相关代码流程,主要是主界面生成的流程。 1.Settings简述: Setting模块大家很熟悉把,那你知道它是怎么形成的吗?...

Android 7.0Settings加载主界面流程

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

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

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

Android蓝牙Settings之界面

布局图如下:   1.ActionBar:Switch 在Android4.0中,在主界面Settings中定义了很多内部子空类,例如: public static c...

从点击Laucher中的图标开始分析加载一个app的第一个界面的流程

0x01. LauncherLauncher就是一个android应用,管理管面上的应用安装和卸载.Launcher在Android源码中的位置.packages/apps/Launcher2orpa...

代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕

需求是:手机默认的原来是恢复出厂设置是点勾的就是屏幕可以旋转的,现在要改为不打勾屏幕不可以旋转 1:显示设置的目录android\packages\apps\Settings\src\com\andr...
  • lwnlwn1
  • lwnlwn1
  • 2015年07月23日 11:14
  • 1102

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

项目需要修改4.0的settings,先写点界面修改部分的实现吧 一、上面的分页tab android3.0以后就加入了ActionBar,上面的那条是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码流程分析二:Settings-蓝牙分析-加载界面
举报原因:
原因补充:

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