Как сделать соединение BLE, которое подключено с помощью службы, для использования во всех действиях без остановки службы или отключения ble?

У меня есть 3 компонента.

  1. Действие 1 имеет кнопку для подключения и отключения подключения 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

Теперь, как мне использовать существующее подключение устройства BLE в Activity2?

Мое временное решение:

Я повторно подключаю устройство BLE при переходе к Activity2 с помощью нового экземпляра службы, привязанного к нему из контекста Activity2. . (Чего я не хочу.)

В Activity2 я проверяю, запущена ли уже моя служба, если она не запущена, то я снова привязываю службу из контекста Activity2.

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");
    }

активировать соединение в onServiceConnected() при обратном вызове ServiceConnection

@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.

Любое решение для сохранения подключения к устройству ble во всех действиях?


person Dinesh Ravi    schedule 07.11.2015    source источник


Ответы (1)


Создайте LocalBinder (расширяет Binder) в своем классе обслуживания. Из действия № 1 вы можете запустить службу, а также использовать bindservice для доступа к объекту связывателя и вызвать unbindservice для отключения от службы. Из действия № 2 вы можете просто снова вызвать bindservice, чтобы получить доступ к объекту связывателя, поскольку служба все еще работает. Таким образом, вы можете поддерживать постоянную работу службы и получать доступ к подключенным объектам Bluetooth. Обратитесь к примеру по ссылке ниже.

пример связанной службы

person siva    schedule 07.11.2015