React Native Android应用配对BLE设备后崩溃问题求助
解决思路
检查BLE相关广播接收器的注册与注销
配对、蓝牙开关会触发系统广播(如ACTION_BOND_STATE_CHANGED、ACTION_BLUETOOTH_STATE_CHANGED),若react-native-ble-manager或自定义原生代码中注册了这些广播但未在onDestroy()中正确注销,可能导致ActivityThread处理广播时引用已销毁的Activity上下文,引发崩溃。- 打开Android原生项目的
MainActivity.java,检查手动注册的广播接收器,确保在onDestroy()方法中调用unregisterReceiver()注销。 - 尝试升级react-native-ble-manager到最新稳定版,旧版本可能存在广播管理的bug。
- 打开Android原生项目的
阻止Activity因蓝牙状态变更重启
崩溃日志指向ActivityThread.performLaunchActivity,说明Activity重启时出现异常。不要用super.onCreate(null)绕过状态恢复,正确做法是在AndroidManifest.xml的MainActivity标签中添加配置,避免系统因蓝牙相关变更重启Activity:<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden|bluetooth"> <!-- 其他配置 --> </activity>调整createBond的调用时机与线程
- 确保设备连接完全稳定后再调用
createBond,比如在连接成功的回调触发后延迟1-2秒执行,避免连接未建立完成就触发配对。 - 尝试在Android主线程中调用
createBond,RN侧可通过UIManager实现:import { Platform, NativeModules } from 'react-native'; import BleManager from 'react-native-ble-manager'; if (Platform.OS === 'android') { NativeModules.UIManager.runOnUiThread(() => { BleManager.createBond(deviceId) .then(() => console.log('配对请求已发送')) .catch(err => console.error('配对失败:', err)); }); }
- 确保设备连接完全稳定后再调用
排查Bond状态监听的原生逻辑
- 若自定义了原生代码监听Bond状态变化,避免直接持有Activity引用,改用Application Context;同时确保在Activity销毁时移除所有RN回调。
- 查看Sentry的完整崩溃栈,定位具体子异常(如空指针、内存泄漏),这能精准锁定问题根源。
验证原生配对逻辑的兼容性
编写简单的Android原生测试项目,直接连接BLE设备并调用createBond,若原生项目也崩溃,说明是设备或系统版本兼容性问题(部分Android 10/11版本存在BLE配对bug);若原生正常,则问题出在RN层的封装或交互逻辑。清理BLE缓存与旧配对记录
- 清除应用的存储数据,重置BLE相关缓存。
- 删除手机蓝牙配对列表中该设备的旧记录,重新进行连接配对测试。
内容的提问来源于stack exchange,提问作者tommyt4a
相关产品推荐
相关产品推荐

