Android4.4 蓝牙源代码段分析

Android4.4 蓝牙源代码段分析

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

最近GOOGLE发布时间Android4.4,我看了看源代码。4.4蓝牙打开过程或这部分的一些变化,判断蓝牙开关是从接口设置settings在里面switch开关,widget当然,它可以切换,也许启动不同的过程是相同的。第一眼systemServer.java该代码。。真机情况下我们关心的是最后一个else分支。

if (SystemProperties.get(“ro.kernel.qemu”).equals(“1”)) {

                Slog.i(TAG, “No Bluetooh Service (emulator)”);

            } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {

                Slog.i(TAG, “No Bluetooth Service (factory test)”);

            } else if (!context.getPackageManager().hasSystemFeature

                       (PackageManager.FEATURE_BLUETOOTH)) {

                Slog.i(TAG, “No Bluetooth Service (Bluetooth Hardware Not Present)”);

            } else if (disableBluetooth) {

                Slog.i(TAG, “Bluetooth Service disabled by config”);

            } else {

                Slog.i(TAG, “Bluetooth Manager Service”);

                bluetooth = new BluetoothManagerService(context);

                ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, bluetooth);

            }

看下bluetoothManagerService的构造方法,我们看三个地方。 loadStoredNameAndAddress()是读取蓝牙打开默认名称的地方。isBluetoothPersistedStateOn()是推断是否已打开蓝牙的,假设已打开。兴许操作要运行开启蓝牙的动作

BluetoothManagerService(Context context) {

        mHandler = new BluetoothHandler(IoThread.get().getLooper());

        mContext = context;

        mBluetooth = null;

        mQBluetooth = null;

        mBinding = false;

        mUnbinding = false;

        mEnable = false;

        mState = BluetoothAdapter.STATE_OFF;

        mQuietEnableExternal = false;

        mEnableExternal = false;

        mAddress = null;

        mName = null;

        mErrorRecoveryRetryCounter = 0;

        mContentResolver = context.getContentResolver();

        mCallbacks = new RemoteCallbackList<IBluetoothManagerCallback>();

        mQCallbacks = new RemoteCallbackList<IQBluetoothManagerCallback>();

        mStateChangeCallbacks = new RemoteCallbackList<IBluetoothStateChangeCallback>();

        IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);

        filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);

        filter.addAction(Intent.ACTION_USER_SWITCHED);

        registerForAirplaneMode(filter);

        mContext.registerReceiver(mReceiver, filter);

        loadStoredNameAndAddress();

        if (isBluetoothPersistedStateOn()) {

            mEnableExternal = true;

        }

    }

另外的registerForAirplaneMode方法,例如以下

private void registerForAirplaneMode(IntentFilter filter) {

        final ContentResolver resolver = mContext.getContentResolver();

        final String airplaneModeRadios = Settings.Global.getString(resolver,

                Settings.Global.AIRPLANE_MODE_RADIOS);

        final String toggleableRadios = Settings.Global.getString(resolver,

                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);

        boolean mIsAirplaneSensitive = airplaneModeRadios == null ? true :

                airplaneModeRadios.contains(Settings.Global.RADIO_BLUETOOTH);

        if (mIsAirplaneSensitive) {

            filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);

        }

    }

当中

Settings.Global.getString(resolver,

                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS)

获取到的值是在String文件里定义的,如:

<!– Comma-separated list of bluetooth, wifi, and cell. –>

    <string name=”def_airplane_mode_radios” translatable=”false”>cell,bluetooth,wifi,nfc,wimax</string>

表示假设开启飞行模式下,哪些服务将会被关闭。所以registerForAirplaneMode方法就是在假设蓝牙也受飞行模式影响。那么飞行模式的变化也将使蓝牙服务收到对应广播。

界面上开关就是BluetoothEnabler.java这个类了,而setBluetoothEnabled()则是详细开关动作。当中有开关的回调函数,代码例如以下:

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // Show toast message if Bluetooth is not allowed in airplane mode
        if (isChecked
                && (WifiSettings.needPrompt(mContext) || !WirelessSettings.isRadioAllowed(
                        mContext, Settings.Global.RADIO_BLUETOOTH))) {
            Toast.makeText(mContext, R.string.wifi_in_airplane_mode,
                    Toast.LENGTH_SHORT).show();
            // Reset switch to off
            buttonView.setChecked(false);
        }

        // shouldn’t setBluetoothEnabled(true) in airplane mode.
        if (mLocalAdapter != null) {
            if (isChecked && WifiSettings.needPrompt(mContext)) {
                return;
            }
            mLocalAdapter.setBluetoothEnabled(isChecked);
        }
        mSwitch.setEnabled(false);
    }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117278.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言 — void的用法解析[通俗易懂]

    C语言 — void的用法解析[通俗易懂]C语言-void的用法解析简介​ void中文翻译为”无类型”,有的也叫”空类型”。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。用法​ void应用最广泛的就是跟指针结合,即void* //无类型指针,也称为空指针,可以指向任何类型的数据 //注意一点:当我们需要使用void类型的的指针变量区指向 某一类型的变量的时候,必须要对其进行类型转换​ 这里补充一点:因为我们在定义一个指针变量的时候第一件事就是指定我们指针变量所指向的变量的类型。一

    2022年5月19日
    104
  • 2015阿里校招前端在线题目[通俗易懂]

    2015阿里校招前端在线题目

    2022年1月27日
    46
  • 指纹解锁特效怎么做?2022最简单的教程来咯「建议收藏」

    指纹解锁特效怎么做?2022最简单的教程来咯「建议收藏」在视频模板的制作过程中我们是有机会用到手机解锁的动效的,AE怎么制作手机解锁动效呢?今天就来跟大家分享一波BeardChicken大神制作的极具炫酷以及科技感的手机解AE制作手机解锁动效教程1.在绘图软件中画好背景、指纹图标以及指纹上方的圆圈,将其导入到AE中,指纹和圆圈生成合成,然后将指纹解锁的光效也导入到AE中,并调整其位置缩放后调整到指纹上层;2.打开[展开“转换控制”窗格]和[展开“入点”“出点”“持续时间”“伸缩”窗格],降低[持续时间],勾选[剪切蒙版];.

    2022年8月10日
    8
  • Matlab绘图(一二三维)

    Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,M

    2021年12月22日
    41
  • linux shell脚本编写实例_常用的shell脚本

    linux shell脚本编写实例_常用的shell脚本LINUXShell脚本编程实例详解(一)上ping命令测试网段内主机的2例详解使用linux已经有10来年了但是一直止于各种服务器的搭建和环境的调优,能力不能得到提升,今天突然下定决心学习Shell脚本编程,因此以网上广为流传的《Shell脚本100例》为基础学习、实验和笔记。废话不说上栗子。使用vimshell100-scanip-1.sh命令创建脚本文件#!/bin…

    2022年10月3日
    3
  • goland 2021.01激活码【永久激活】

    (goland 2021.01激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~B…

    2022年3月22日
    273

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号