如何将值从服务传输到活动?

Posted

技术标签:

【中文标题】如何将值从服务传输到活动?【英文标题】:How to transmit a value from Service to Activity? 【发布时间】:2013-10-23 08:50:30 【问题描述】:

我正在开发一个应用程序,我必须连接到 android 4.3 上的蓝牙设备。

我有两个java文件,一个是DeviceControl extends Activity另一个是BluetoothLeService extends Service

我调用 BluetoothLeService.java 中的函数,我希望它返回 rssi 值给 DeviceControl.java

我在DeviceControl.java中使用mRssi = intent.getStringExtra(EXTRAS_DEVICE_RSSI);,它会从BluetoothLeService.java中的rssi接收值。

但它总是在 DeviceControl.java 中显示 value 为 null

为什么mRssi的值为null??

这是BluetoothLeService.java

中的函数
        public class BluetoothLeService extends Service 

public final static String ACTION_RSSI_VALUE_READ = "com.example.bluetooth.le.ACTION_RSSI_VALUE_READ";

                                .
                                .
                                .
            public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) 
    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);


public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) 
    //super.onReadRemoteRssi(gatt, rssi, status);
    if(status == BluetoothGatt.GATT_SUCCESS) 
        final Intent intent = new Intent();
        intent.setAction(ACTION_RSSI_VALUE_READ);               
        broadcastUpdate(ACTION_RSSI_VALUE_READ, rssi);
            //call and send the intent and rssi to broadcastUpdate function
    


//broadcastUpdate function receive the intent and rssi value, and transmit to the DeviceControl.java by using sendBroadcast.
private void broadcastUpdate(final String action, final int rssi) 
    final Intent intent = new Intent(action);
    intent.putExtra(DeviceControl.EXTRAS_DEVICE_RSSI, rssi);
    Log.v(TAG, "rssi action = " + action);
    Log.v(TAG, "RSSI = " + rssi);
    sendBroadcast(intent);


private void broadcastUpdate(final String action) 
    final Intent intent = new Intent(action);
    sendBroadcast(intent);


private void broadcastUpdate(final String action, final BluetoothGattCharacteristic characteristic) 

    final Intent intent = new Intent(action);

    final byte[] data = characteristic.getValue();
    if (data != null && data.length > 0) 
        final StringBuilder stringBuilder = new StringBuilder(data.length);
        for(byte byteChar : data)
            stringBuilder.append(String.format("%02X", byteChar));
        intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
    
    sendBroadcast(intent);

以及DeviceControl.java中的代码

    

public class DeviceControl extends Activity 

public static final String EXTRAS_DEVICE_RSSI = "DEVICE_RSSI";
private String mRssi;

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() 

    @Override
    public void onReceive(Context context, Intent intent) 
        // TODO Auto-generated method stub
        final String action = intent.getAction();

         final Intent intent = getIntent();
                 mRssi = intent.getStringExtra(EXTRAS_DEVICE_RSSI); //Use **mRssi** to receive the value from BluetoothLeService.java 
                 Log.d(TAG, "mRssi = " + mRssi);

         if(BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) 
            mConnect = true;
            updateConnectionState(R.string.connected);
            invalidateOptionsMenu();
         else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) 
            mConnect = false;
            updateConnectionState(R.string.disconnected);
            invalidateOptionsMenu();
          else if (BluetoothLeService.ACTION_RSSI_VALUE_READ.equals(action)) 
            mRssi = intent.getStringExtra(EXTRAS_DEVICE_RSSI);
            Log.v(TAG, "mRssi == :" + mRssi);
        //if the action is EXTRAS_DEVICE_RSSI, receive the rssi value
    
;

编辑

BluetoothLeService.java 中的代码 修改onReadRemoteRssibroadcastUpdate的代码。

DeviceControl.java中的代码 在onReceive

中添加从intent接收值的代码

我从日志文件中看到了日志,它在 BluetoothLeService.java 的广播更新函数中显示了日志消息,如下所示:

Log.v(TAG, "rssi action = " + action);
Log.v(TAG, "RSSI = " + rssi);

但我没有看到任何关于 action = EXTRAS_DEVICE_RSSI 的日志。 我不知道是 sendBroadcast 没有发送还是 onReceive 没有调用???

【问题讨论】:

【参考方案1】:

尝试这样,在广播之前添加Action

final Intent intent = new Intent();
intent.putExtra(DeviceControl.EXTRAS_DEVICE_RSSI, rssi);
intent.setAction(YOUR_INTENT_FILETR);  
sendBroadcast(intent);

【讨论】:

我可以在 DeviceControl.java 中有两个 onReceivce 从 BluetoothLeService.java 接收不同的 Intent 吗??? @MartinWun 因为你需要两个不同的 Intent-Filter 来识别哪个 BroadcastRecieve 收到你的消息。 我已经编辑了代码,我使用 sendBroadcast 发送意图。但是接收者没有收到意图。 我添加了intentFilter.addAction(BluetoothLeService.ACTION_RSSI_VALUE_READ); 后解决了这个问题。但现在我必须解决以下日志类型的问题:W/Bundle (4741): Key DEVICE_RSSI expected String but value is a java.lang.Integer。返回默认值 。 W/Bundle(4741):尝试转换生成的内部异常:W/Bundle(4741):java.lang.ClassCastException:java.lang.Integer 不能转换为 java.lang.String【参考方案2】:

你正在阅读创建活动的意图,而不是广播意图,所以它当然是空的......

【讨论】:

以上是关于如何将值从服务传输到活动?的主要内容,如果未能解决你的问题,请参考以下文章

将值从 bash 反向传输到 LO 宏

C# SQL 命令参数,将值从表单“传输”到对象再到方法

使用列表将值从一个类传输到另一个类

如何将值从一个活动传递到上一个活动

通过 Laravel 中的 AJAX 发布请求将值从一个视图传递到另一个视图

如何将值从片段/活动传递到 xml?