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


相关推荐

  • 为你的爬虫添加 IP 池反反爬策略[通俗易懂]

    为你的爬虫添加 IP 池反反爬策略[通俗易懂]为你的爬虫添加 IP 池反反爬策略

    2022年4月21日
    64
  • layui弹框传值_LAYUI弹出层详解

    layui弹框传值_LAYUI弹出层详解还是一步步展示把首先,layer可以独立使用,也可以通过Layui模块化使用。我个人一直是用的模块化的所以下面素有的都是基于模块化的。引入好相关文件就可以开始啦今天放图片把试着学一下放图片1.最简单的弹层,这个弹层的效果其实就是一个加了特效和样式的alert();代码如下:layui.use(“layer”,function(){varlayer=layui.layer;la…

    2022年6月1日
    90
  • 英伟达、英特尔、AMD显卡设置,减少游戏掉帧卡顿「建议收藏」

    英伟达、英特尔、AMD显卡设置,减少游戏掉帧卡顿「建议收藏」英伟达显卡设置首先要更新英伟达显卡驱动。1、右键桌面,选择【NVIDIA控制面板】,在打开的面板中,选择左侧的【管理3D设置】。2、在管理3D设置中,更改以下选项(部分显卡可能会没有以下部分选项,可以不设置相应选项):首选图形处理器更改为英伟达显卡 OpenGL渲染GPU更改为英伟达显卡 三重缓冲更改为【开】 低延迟模式更改为【超高】 电源管理模式更改为【最高性能优先】 …

    2022年5月20日
    179
  • JAVA基础——接口(全网最详细教程)「建议收藏」

    JAVA基础——接口(全网最详细教程)「建议收藏」Java基础——接口接口概念官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。我的解释:接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组…

    2022年6月5日
    32
  • android签名命令行,Android系统签名位置及命令

    android签名命令行,Android系统签名位置及命令app需要使用系统的权限在AndroidManifest.xml中声明了系统全下申明了系统权限android:sharedUserId=”android.uid.system”1.找到平台签名文件“platform.pk8”和“platform.x509.pem”文件位置android/build/target/product/security/2.签名工具“signapk.jar”位置…

    2022年6月21日
    25
  • PyCharm配置教程[通俗易懂]

    PyCharm配置教程[通俗易懂]一、安装进入pyCharm官网:https://www.jetbrains.com/pycharm。根据自己的操作系统选择相应的下载包。其中专业版是要付费的,可以自行购买,也可以google搜索激活成功教程教程。下载后根据提示安装即可二、配置1.设置主题以及字体大小点击PyCharm,进入preferences选项设置更改主题以及字体颜色2.配置属于自己的文件模板举个例子,如果你要创建一个python文件,那么你可能需要类似这样的代码注释在文件的最上方文件代码注释如果我们

    2022年8月26日
    11

发表回复

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

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