蓝牙bluetooth的framework层学习

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

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

1、mBluetooth和mBluetoothBinder生成的

case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {
	IBinder service = (IBinder) msg.obj;
	
	mBinding = false;
	mBluetoothBinder = service;
	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

BluetoothAdapter(IBluetoothManager managerService) {
	mService = managerService.registerAdapter(mManagerCallback); //这儿返回的mService有可能是空
}

private final IBluetoothManagerCallback mManagerCallback =
		new IBluetoothManagerCallback.Stub() {
			public void onBluetoothServiceUp(IBluetooth bluetoothService) {
				mService = bluetoothService; 
			}
		}

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

public void registerStateChangeCallback(IBluetoothStateChangeCallback callback) {
	Message msg = mHandler.obtainMessage(MESSAGE_REGISTER_STATE_CHANGE_CALLBACK);
	msg.obj = callback;
	mHandler.sendMessage(msg);
}

case MESSAGE_REGISTER_STATE_CHANGE_CALLBACK: {
	IBluetoothStateChangeCallback callback =
			(IBluetoothStateChangeCallback) msg.obj;
	mStateChangeCallbacks.register(callback);
	break;
}

回调调用:

    private final IBluetoothCallback mBluetoothCallback = new IBluetoothCallback.Stub() {
        public void onBluetoothStateChange(int prevState, int newState) throws RemoteException {
            Message msg =
                    mHandler.obtainMessage(MESSAGE_BLUETOOTH_STATE_CHANGE, prevState, newState);
            mHandler.sendMessage(msg);
        }
    };

case MESSAGE_BLUETOOTH_STATE_CHANGE: {
	int prevState = msg.arg1;
	int newState = msg.arg2;
	mState = newState;
	bluetoothStateChangeHandler(prevState, newState);

private void sendBluetoothStateCallback(boolean isUp) {
		int n = mStateChangeCallbacks.beginBroadcast();
		for (int i = 0; i < n; i++) {
			try {
				mStateChangeCallbacks.getBroadcastItem(i).onBluetoothStateChange(isUp);
			} catch (RemoteException e) {
				Slog.e(TAG, "Unable to call onBluetoothStateChange() on callback #" + i, e);
			}
		}
}

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

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

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

BluetoothManagerService.java
public boolean enable(String packageName) throws RemoteException {
	sendEnableMsg(false,
			BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
}

case MESSAGE_ENABLE:
	handleEnable(mQuietEnable);

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

private class BluetoothServiceConnection implements ServiceConnection {
	private BluetoothServiceConnection() {
	}

	public void onServiceConnected(ComponentName componentName, IBinder service) {
		String name = componentName.getClassName();
		if (name.equals("com.android.bluetooth.btservice.AdapterService")) {
			msg.arg1 = 1;
		} else {
			if (!name.equals("com.android.bluetooth.gatt.GattService")) {
				Slog.e("wqy--BluetoothManagerService", "Unknown service connected: " + name);
			}
		}
	}

	public void onServiceDisconnected(ComponentName componentName) {
	}
}

private BluetoothManagerService.BluetoothServiceConnection mConnection = new BluetoothManagerService.BluetoothServiceConnection();

private void handleEnable(boolean quietMode) {
	if (!doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
			UserHandle.CURRENT)) {}
}

boolean doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {
	Slog.e(TAG, "doBind....");
	ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
	intent.setComponent(comp);
	if (comp == null || !mContext.bindServiceAsUser(intent, conn, flags, user)) {
		Slog.e(TAG, "Fail to bind to: " + intent);
		return false;
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值