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
相关产品推荐
相关产品推荐

