我的广播接收器不接收来自本地服务的广播

My Broadcast Receiver does not receive broadcasts from Local Service

我是 android 开发的新手,目前我正在尝试修改此处 https://developer.android.com/samples/BluetoothLeGatt/index.html 找到的蓝牙 LE 接口的示例代码。
这个演示项目分为两个活动,但我想将其减少为一个 activity; DeviceControlActivity 更改为 'regular' Java class。 经过几次尝试后,我使用我的设备控制 class:

的构造函数创建了 BluetoothLeService 运行
public DeviceControl (BluetoothDevice device, Context context) {
    mDeviceName = device.getName();
    mDeviceAddress = device.getAddress();
    this.context = context;

    Log.d(TAG, "DeviceControl construktor");
    Log.d(TAG, "Context = " + context);

    Intent gattServiceIntent = new Intent(context, BluetoothLeService.class);
    context.bindService(gattServiceIntent, mServiceConnection, context.BIND_AUTO_CREATE);

}

BluetoothLeService class 充满了 Log.d() 并且似乎工作正常;然而,它在这里发出的广播:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        String intentAction;
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            intentAction = ACTION_GATT_CONNECTED;
            mConnectionState = STATE_CONNECTED;
            broadcastUpdate(intentAction);
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:" +
                    mBluetoothGatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            intentAction = ACTION_GATT_DISCONNECTED;
            mConnectionState = STATE_DISCONNECTED;
            Log.i(TAG, "Disconnected from GATT server.");
            broadcastUpdate(intentAction);
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic characteristic,
                                     int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
    }
};

private void broadcastUpdate(final String action) {
    Log.d(TAG, "Methode broadcastUpdate aufgerufen. Action = " + action);
    final Intent intent = new Intent(action);
    sendBroadcast(intent);
}

但是,它们从未到达 DeviceControl Class 我最初将服务绑定到:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "Broadcast received");
        final String action = intent.getAction();
        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {

        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {

        } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            // Show all the supported services and characteristics on the user interface.
            System.out.println("GATT-services discovered");
            displayGattServices(mBluetoothLeService.getSupportedGattServices());
        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
           displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
        }
    }
};

这是怎么回事?

我还不能发表评论,但是它已经注册了吗?

您必须使用 registerReceiver 方法注册广播接收器。

P.S。如果您正在使用 AppCompat 库并且不需要广播离开您的应用程序,请查看 LocalBroadcastManager.

谢谢 RobK,
确实我没有注册广播。注册代码不在示例项目 activity 中的 onCreate() 方法中,我希望在其中设置服务所需的一切,但在 onResume() 方法中。

添加

registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
    if (mBluetoothLeService != null) {
        final boolean result = mBluetoothLeService.connect(mDeviceAddress);
        Log.d(TAG, "Connect request result=" + result);
    }

构造函数和一个额外的自定义 intent 过滤器

    private static IntentFilter makeGattUpdateIntentFilter() {
    final IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
    intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
    return intentFilter;
}

帮我解决了。