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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 阿里云服务器Centos 7的crontab重启命令

    阿里云服务器Centos 7的crontab重启命令

    2021年10月3日
    59
  • snmptrap 命令解析「建议收藏」

    snmptrap 命令解析「建议收藏」example:#snmptrap-v2c-cpublic10.10.12.219″aaa”1.3.6.1.4.1.2345SNMPv2-MIB::sysLocation.0s”justhere” snmptrap命令-v2cSnmp协议版本-cpublic共同体10.10.12.

    2022年8月20日
    6
  • 什么是java构造函数_什么是java构造函数

    什么是java构造函数_什么是java构造函数构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值。构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。我们人出生的时候,有些人一出生之后再起名字的,但…

    2022年7月8日
    20
  • mysql 窗口函数排序[通俗易懂]

    mysql 窗口函数排序[通俗易懂]窗口函数rank,dense_rank,row_numberselect*,rank()over(orderby成绩desc)asranking,dense_rank()over(orderby成绩desc)asdese_rank,row_number()over(orderby成绩desc)asrow_numfrom班级

    2022年9月26日
    2
  • 基于ssm的医院病历管理系统SSM医院管理系统

    基于ssm医院病历管理系统基于ssm医院病历管理系统介绍:eclipse,mysql,spring,springmvc,mybatis本设计主要实现集人性化、高效率、便捷等优点于一身的医院病历管理系统,完成系统用户管理、医生管理、护士管理、病人管理、病历管理、药品管理、医生统计等功能模块医院病历管理系统的设计与实现摘要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,

    2022年4月9日
    40
  • N3K跨网段流量异常

    N3K跨网段流量异常

    2021年9月14日
    42

发表回复

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

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