其他分享
首页 > 其他分享> > android – 如何使用服务连接的BLE连接在不停止服务或断开连接的情况下跨活动使用?

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

作者:互联网

我有3个组件.

> Activity1具有用于连接和断开BLE连接的按钮
> Activity2需要从BLE设备获取数据.
>服务所有连接逻辑(如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设备连接?

我临时解决方案:

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

在Activity2中,我正在检查我的服务是否已经在运行,如果没有运行,那么我再次从Activity2 Context绑定服务.

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()总是返回false.意味着从Activity1移动到Activity2时服务会断开连接

任何解决方案都可以在活动中保持连接设备的连接?

解决方法:

在Service类中创建LocalBinder(扩展Binder).从活动#1开始,您可以启动该服务,并使用bindservice访问binder对象并调用unbindservice以断开与服务的连接.从Activity#2开始,您可以再次调用bindservice来访问binder对象,因为服务仍在运行.这样,您可以始终保持服务运行并访问连接的蓝牙对象.请参阅下面的示例链接.

bound service example

标签:android,android-service,bluetooth-lowenergy,android-ble
来源: https://codeday.me/bug/20190628/1314285.html