• Android4.4 蓝牙源码部分分析


    最近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();
    mQCallbacks = new RemoteCallbackList();
    mStateChangeCallbacks = new RemoteCallbackList();
    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文件中定义的,如:


    cell,bluetooth,wifi,nfc,wimax


    表示如果开启飞行模式下,哪些服务将会被关闭。所以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);
    }

  • 相关阅读:
    lightoj-1047
    lightoj-1044
    lightoj-1045
    lightoj-1082
    LeetCode偶尔一题 —— 19. 删除链表的倒数第N个节点
    Python 3.52官方文档翻译 http://usyiyi.cn/translate/python_352/library/index.html 必看!
    Python3 time模块
    JavaScript CSS 等前端推荐
    Python之 七级字典查询
    将Sublime Text 3设置为Python全栈开发环境(转一个链接)
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3951688.html
Copyright © 2020-2023  润新知