• 蓝牙bluetooth的framework层学习


    参考:Android -- Bluetooth framework启动过程简析_第一序列丶的博客-CSDN博客

    framework层包括 api、service、bluetooth.apk,这里大致记录下它们间的联系

    1、mBluetooth和mBluetoothBinder生成的

    1. case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {
    2. IBinder service = (IBinder) msg.obj;
    3. mBinding = false;
    4. mBluetoothBinder = service;
    5. mBluetooth = IBluetooth.Stub.asInterface(Binder.allowBlocking(service));

    2、BluetoothAdapter与BluetoothManagerService.java建立联系,注册回调

    BluetoothAdapter.java

    system/bt/binder/android/bluetooth/IBluetoothManager.aidl

    private IBluetooth mService;  这个是链接bluetooth.apk的service

    1. BluetoothAdapter(IBluetoothManager managerService) {
    2. mService = managerService.registerAdapter(mManagerCallback); //这儿返回的mService有可能是空
    3. }
    4. private final IBluetoothManagerCallback mManagerCallback =
    5. new IBluetoothManagerCallback.Stub() {
    6. public void onBluetoothServiceUp(IBluetooth bluetoothService) {
    7. mService = bluetoothService;
    8. }
    9. }

    3、各个模块监听BluetoothState的状态
    在BluetoothManagerService.java
    回调注册:

    1. public void registerStateChangeCallback(IBluetoothStateChangeCallback callback) {
    2. Message msg = mHandler.obtainMessage(MESSAGE_REGISTER_STATE_CHANGE_CALLBACK);
    3. msg.obj = callback;
    4. mHandler.sendMessage(msg);
    5. }
    6. case MESSAGE_REGISTER_STATE_CHANGE_CALLBACK: {
    7. IBluetoothStateChangeCallback callback =
    8. (IBluetoothStateChangeCallback) msg.obj;
    9. mStateChangeCallbacks.register(callback);
    10. break;
    11. }

    回调调用:

    1. private final IBluetoothCallback mBluetoothCallback = new IBluetoothCallback.Stub() {
    2. public void onBluetoothStateChange(int prevState, int newState) throws RemoteException {
    3. Message msg =
    4. mHandler.obtainMessage(MESSAGE_BLUETOOTH_STATE_CHANGE, prevState, newState);
    5. mHandler.sendMessage(msg);
    6. }
    7. };
    8. case MESSAGE_BLUETOOTH_STATE_CHANGE: {
    9. int prevState = msg.arg1;
    10. int newState = msg.arg2;
    11. mState = newState;
    12. bluetoothStateChangeHandler(prevState, newState);
    13. private void sendBluetoothStateCallback(boolean isUp) {
    14. int n = mStateChangeCallbacks.beginBroadcast();
    15. for (int i = 0; i < n; i++) {
    16. try {
    17. mStateChangeCallbacks.getBroadcastItem(i).onBluetoothStateChange(isUp);
    18. } catch (RemoteException e) {
    19. Slog.e(TAG, "Unable to call onBluetoothStateChange() on callback #" + i, e);
    20. }
    21. }
    22. }

    各个模块注册监听bluetooth状态
    比如:BluetoothProfileConnector.java

    1. void connect(Context context, BluetoothProfile.ServiceListener listener) {
    2. IBluetoothManager mgr = BluetoothAdapter.getDefaultAdapter().getBluetoothManager();
    3. mgr.registerStateChangeCallback(mBluetoothStateChangeCallback);
    4. doBind();
    5. }

    4、使能蓝牙开关
    BluetoothAdapter.java
    enable() , disable(),enableBLE() 可以使能蓝牙,调用到bluetoothmanagerservice.java

    1. BluetoothManagerService.java
    2. public boolean enable(String packageName) throws RemoteException {
    3. sendEnableMsg(false,
    4. BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
    5. }
    6. case MESSAGE_ENABLE:
    7. handleEnable(mQuietEnable);

    5、bluetoothmanagerservice.java与bluetooth.apk建立联系

    1. private class BluetoothServiceConnection implements ServiceConnection {
    2. private BluetoothServiceConnection() {
    3. }
    4. public void onServiceConnected(ComponentName componentName, IBinder service) {
    5. String name = componentName.getClassName();
    6. if (name.equals("com.android.bluetooth.btservice.AdapterService")) {
    7. msg.arg1 = 1;
    8. } else {
    9. if (!name.equals("com.android.bluetooth.gatt.GattService")) {
    10. Slog.e("wqy--BluetoothManagerService", "Unknown service connected: " + name);
    11. }
    12. }
    13. }
    14. public void onServiceDisconnected(ComponentName componentName) {
    15. }
    16. }
    17. private BluetoothManagerService.BluetoothServiceConnection mConnection = new BluetoothManagerService.BluetoothServiceConnection();
    18. private void handleEnable(boolean quietMode) {
    19. if (!doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
    20. UserHandle.CURRENT)) {}
    21. }
    22. boolean doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {
    23. Slog.e(TAG, "doBind....");
    24. ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
    25. intent.setComponent(comp);
    26. if (comp == null || !mContext.bindServiceAsUser(intent, conn, flags, user)) {
    27. Slog.e(TAG, "Fail to bind to: " + intent);
    28. return false;
    29. }
    30. return true;
    31. }

  • 相关阅读:
    HTML+CSS-Day10
    c_结构体
    【ArcGIS微课1000例】0033:地图点状标记符号设计教程
    【英语:发音基础】A6.基础词汇-核心形容词
    尚医通(一)
    【excel密码】excel文件加密方法总结:
    【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...
    Image does NOT change color when selecting it in tiptap
    对‘QBasicAtomicInt_fetchAndAddOrdered(int volatile*, int)’未定义的引用
    Redis五种基本数据结构
  • 原文地址:https://blog.csdn.net/yudelian/article/details/126247233