You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BLE开发:通过Intent跨Activity传递RSSI值未收到数据问题求助

解决BLE开发中Intent传递RSSI值失败的问题

我来帮你排查下这个问题,你遇到的「未从Intent接收到数据」的情况,大概率是因为Intent的发送逻辑不完整或者Activity2的接收方式不对,咱们一步步来解决:

1. 先检查Activity1的Intent发送逻辑

你贴的代码里只创建了Intent并添加了Extra,但如果没有调用启动Activity的方法,Activity2根本不会收到这个Intent。另外还要看你的场景:

  • 如果是要打开新的Activity2,那必须加上startActivity(i):
    @Override 
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { 
        if (status == BluetoothGatt.GATT_SUCCESS) { 
            Log.d("BLE_Strength_connected", String.format("BluetoothGatt ReadRssi[%d]", rssi)); 
            Intent i = new Intent(Activity1.this, Activity2.class); 
            i.putExtra("key", rssi);
            startActivity(i); // 必须调用这个方法才能启动Activity2并传递数据
        }
    }
    
  • 如果Activity2已经在前台运行,用startActivity(i)会重新创建一个Activity2的实例,原来的实例是收不到新数据的,这种场景下就不适合用普通Intent传递了,得换其他方式。

2. 检查Activity2的数据接收逻辑

如果是启动新的Activity2,要在onCreate()里正确获取Extra:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    
    Intent intent = getIntent();
    if (intent != null) {
        // 第二个参数是默认值,当取不到数据时返回-1
        int receivedRssi = intent.getIntExtra("key", -1); 
        Log.d("RSSI_Log", "收到的RSSI值:" + receivedRssi);
        // 这里可以把值显示到UI上
    }
}

如果Activity2已经打开,且你希望它能接收后续的RSSI更新,需要:

  • 把Activity2的launchMode在AndroidManifest.xml里设置为singleTop或者singleTask:
    <activity android:name=".Activity2"
              android:launchMode="singleTop"/>
    
  • 然后在Activity2中重写onNewIntent()方法来接收新的Intent数据:
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent); // 更新当前的Intent为新传递的Intent
        int receivedRssi = intent.getIntExtra("key", -1);
        Log.d("RSSI_Log", "更新的RSSI值:" + receivedRssi);
        // 更新UI显示最新的RSSI
    }
    

3. 针对RSSI实时更新的更优方案

因为RSSI信号会频繁变化,每次变化都启动Activity显然不是最佳选择,推荐用下面两种方式实现实时数据同步:

方式一:本地广播(BroadcastReceiver)

  • Activity1中发送广播:
    @Override 
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { 
        if (status == BluetoothGatt.GATT_SUCCESS) { 
            Log.d("BLE_Strength_connected", String.format("BluetoothGatt ReadRssi[%d]", rssi)); 
            Intent broadcastIntent = new Intent("com.yourpackage.RSSI_UPDATE_ACTION");
            broadcastIntent.putExtra("rssi_value", rssi);
            sendBroadcast(broadcastIntent);
        }
    }
    
  • Activity2中注册并接收广播:
    private BroadcastReceiver rssiUpdateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if ("com.yourpackage.RSSI_UPDATE_ACTION".equals(intent.getAction())) {
                int rssi = intent.getIntExtra("rssi_value", -1);
                // 在这里更新UI显示最新的RSSI值
            }
        }
    };
    
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter("com.yourpackage.RSSI_UPDATE_ACTION");
        registerReceiver(rssiUpdateReceiver, filter);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(rssiUpdateReceiver);
    }
    

方式二:ViewModel + LiveData

这种方式更适合组件间的数据共享,不需要担心生命周期问题:

  • 创建一个共享的ViewModel:
    public class RssiViewModel extends ViewModel {
        private MutableLiveData<Integer> rssiLiveData = new MutableLiveData<>();
    
        public void updateRssi(int rssi) {
            rssiLiveData.setValue(rssi);
        }
    
        public LiveData<Integer> getRssiLiveData() {
            return rssiLiveData;
        }
    }
    
  • Activity1中更新数据:
    @Override 
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { 
        if (status == BluetoothGatt.GATT_SUCCESS) { 
            Log.d("BLE_Strength_connected", String.format("BluetoothGatt ReadRssi[%d]", rssi)); 
            RssiViewModel viewModel = new ViewModelProvider(this).get(RssiViewModel.class);
            viewModel.updateRssi(rssi);
        }
    }
    
  • Activity2中观察数据变化:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        
        RssiViewModel viewModel = new ViewModelProvider(this).get(RssiViewModel.class);
        viewModel.getRssiLiveData().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer rssi) {
                // 当RSSI变化时自动回调,更新UI
                Log.d("RSSI_Log", "实时RSSI:" + rssi);
            }
        });
    }
    

你可以先从检查Intent的发送和接收逻辑入手,如果是需要实时更新RSSI,建议用广播或者ViewModel的方案,体验会更好。

内容的提问来源于stack exchange,提问作者BOB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:17