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);
    }

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • Java Bean Copy 性能大比拼

    Java Bean Copy 性能大比拼

  • @transactional的使用_@transactional注解默认的回滚方式

    @transactional的使用_@transactional注解默认的回滚方式@Transactional是声明式事务管理编程中使用的注解1.添加位置1)接口实现类或接口实现方法上,而不是接口类中。2)访问权限:public的方法才起作用。@Transactional注解应该只被应用到public方法上,这是由SpringAOP的本质决定的。系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管…

  • 到底什么作用

    到底什么作用

  • 非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质

    非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质今天遇到一个很奇怪的问题:一个方阵,逆矩阵存在,但不是满秩。问题来源  在实际应用的时候,发现返回值都是0,于是跟踪到这里,发现了这个问题:JtJ不是满秩,因此JtJN保持初始化的零值。matJtJN=zeros(N,N);matResult=zeros(N,1);if(N==rank(JtJ)){JtJN=inv(JtJ);}for…

    2022年10月25日
  • Linux 查看iptables状态-重启

    Linux 查看iptables状态-重启

    2021年10月19日
  • hook技术截取服务器信息,Windows Hook技术

    hook技术截取服务器信息,Windows Hook技术0x01简介有人称它为“钩子”,有人称它为“挂钩”技术。谈到钩子,很容易让人联想到在钓东西,比如鱼钩就用于钓鱼。编程技术的钩子也是在等待捕获系统中的某个消息或者动作。钩子的应用范围非常广泛,比如输入监控、API拦截、消息捕获、改变程序执行流程等方面。杀毒软件会用Hook技术钩住一些API函数,比如钩住注册表读写函数,从而防止病毒对注册表进行写入;病毒使用Hook技术有针对性的捕获键盘的输入,从而…

发表回复

您的电子邮箱地址不会被公开。

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