如何在不停止服务或断开 ble 连接的情况下建立使用服务连接的 BLE 连接以跨活动使用?

How to make a BLE connection that is connected using service to use across the activities without stopping the service or disconnecting ble?

我有 3 个组件。

  1. Activity1 有用于连接和断开 BLE 连接的按钮

  2. Activity2 需要从 BLE 设备获取数据。

  3. 服务所有连接逻辑(如getRemoteDevice()、connectGatt等)都属于服务。

Activity1 正在通过绑定服务连接到 BLE 设备。

Intent gattServiceIntent = new Intent(mContext,BleService.class);//In Activity1 context
bindService(gattServiceIntent, mServiceConnection,BIND_AUTO_CREATE);

并在按下按钮后立即连接到 ble 设备。

现在,当我从 Activity1 移动到 Activity2 时,我将取消绑定 Activity1 中的服务.

mContext.unbindService(mServiceConnection);//In Activity1 context

现在如何在 Activity2 中使用现有的 BLE 设备连接?

我的临时解决方案:

我正在重新连接 BLE 设备,当通过新服务移动到 Activity2 时从 Activity2 上下文绑定到它的实例。 (我不想要。)

Activity2 我正在检查我的服务是否已经 运行 如果不是 运行 然后我从 再次绑定服务活动 2 上下文。

if(!isMyServiceRunning(BleWrapper.class)){
    Intent wrapperServiceIntent = new Intent(mContext,BleWrapper.class);    
    bindService(wrapperServiceIntent,mBLEWrapperServiceConnection,BIND_AUTO_CREATE);
    }else{
        Log.w(LOGTAG, "Service already connected. In onCreate");
    }

在ServiceConnection回调下的onServiceConnected()中触发连接

@Override
public void onServiceConnected(ComponentName componentName,IBinder service)     {
        
    mBluetoothLeService = ((BleWrapper.LocalBinder) service).getService();

    if (!mBluetoothLeService.initialize()) {
        showAlertDialog(getString(R.string.ble_not_supported_on_this_device));
    }else {
        mBluetoothLeService = BleWrapper.getInstance();
    }
 mBluetoothLeService.connect(/*address from shared preference*/); //Reconnecting to the same device using address stored in Shared pref
}  

用于检查我的服务是否运行

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

但是函数 isMyServiceRunning() 总是 returns false。这意味着服务在从 Activity1 移动到 Activity2

时断开连接

是否有任何在活动中保持蓝牙设备连接的解决方案?

在您的服务中创建一个 LocalBinder(扩展 Binder)class。从 Activity #1,您可以启动服务,还可以使用 bindservice 访问活页夹对象并调用 unbindservice 断开与服务的连接。从 Activity #2,您可以简单地再次调用 bindservice 来访问活页夹对象,因为服务仍然是 运行。这样您就可以始终保持服务 运行 并访问连接的蓝牙对象。请参考下面的示例 link.

bound service example