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


相关推荐

  • 解决项目中java heap space的问题[通俗易懂]

    解决项目中java heap space的问题[通俗易懂]起因 17年的一个项目出了OOM(javaheapspace)问题,眼下有个问题:法院项目,不能外网,一连接外网高院会直接定位到计算机,发出警报(档案的机密性啊)不能远程,那只能视频教他们怎么做了,全程和一个文员说代码,真的很累==! 过程 这个过程对一个不太了解内存的问题的开发无疑是艰难的,搜了一下,知道了是内存溢出导致的,于是着手解决 网上大多数都说调整运行…

    2022年7月8日
    20
  • 基于Vue和Node.js的电商后台管理系统

    基于Vue和Node.js的电商后台管理系统电商后台管理系统(前端项目)预览后端API接口源码下载.接口API功能用于管理用户账号,商品分类,商品信息,订单,数据统计等业务功能开发模式电商后台管理系统整体采用前后端分离的开发模式,其中前端项目是基于Vue技术栈的SPA项目技术选型前端项目技术栈VueVue-routerElement-UIAxiosEcharts后端项目技术栈Node.jsExpressJwtMysqlSequelize接口API.后端源码下载

    2022年6月4日
    44
  • Java多线程面试题(面试必备)

    文章目录一、多线程基础基础知识1.并发编程1.1并发编程的优缺点1.2并发编程的三要素1.3并发和并行有和区别1.4什么是多线程,多线程的优劣?2.线程与进程2.1什么是线程与进程2.2线程与进程的区别2.3用户线程与守护线程2.4什么是线程死锁2.5形成死锁的四个必要条件2.6如何避免死锁3.创建线程的四种方式4.线程状态和基本操作一、多线程基础基础知识1.并发编程1.1并发编程的优缺点优点:充分利用多核CPU的计算能力,通过并发编程的形式将多核CPU的计算.

    2022年4月7日
    31
  • mysql行转列转换

    mysql行转列转换mysql行列转换,在项目中应用的极其频繁,尤其是一些金融项目里的报表。其中最为头痛的就是多行转多列,动态的列行转换。最近在研究这些行里转换,还是从最为简单的行列转换开始。sql脚本–创建表学生表CREATETABLE`student`(`stuid`VARCHAR(16)NOTNULLCOMMENT’学号’,`stunm`VARCHAR(20

    2022年6月14日
    45
  • 提升网页打开速度的实用方法

    提升网页打开速度的实用方法

    2021年10月16日
    36
  • 字符串常量池深入解析[通俗易懂]

    字符串常量池深入解析[通俗易懂]字符串常量池字符串常量池概述一、Java中两种创建字符串对象的方式的分析。二、Intern的实现原理(JDK1.8)三、JDK1.7的Intern的执行四:几种特殊的情况的代码参考的部分文章概述  在分析字符串常量池之前,先来分析一下java的内存区域,然后再各种的情况分析一下各种情况下的情况;在《深入理解java虚拟机》这本书上是这样写的:对于H…

    2022年7月28日
    1

发表回复

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

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