React Native应用被系统杀死重启后如何保留Native Module的Callback引用
核心结论
React Native 提供的 Callback 接口无法序列化,也不存在可行的持久化调用方案。它本质是和当前 JS 运行时上下文、CatalystInstance 实例绑定的临时代理对象,一旦应用进程被系统销毁重建,整个 JS 运行环境、Native Module 实例都会重新初始化,旧的 Callback 引用就算强行保留,也无法指向新 JS 环境中的对应回调逻辑,调用后不会产生任何预期效果。
可行的替代实现方案
方案1:全局事件+持久化存储配合
放弃通过
Callback直接传递结果的逻辑:Native 侧 Activity 执行结束后,先把结果数据持久化存储到SharedPreferences、本地数据库或者全局内存缓存中,再通过 React Native 内置的DeviceEventManager或者自定义的 Native 全局事件总线,向 JS 侧发送约定好的结果事件。JS 侧只需要在应用初始化时注册对应事件的监听,收到事件后读取本地存储的结果执行后续逻辑即可。
该方案完全不依赖临时的Callback引用,就算进程重建,JS 侧重新注册监听后依然可以正常收到通知、处理结果。方案2:请求唯一标记关联回调
启动 Activity 时生成一个唯一的
requestId附加到启动 Intent 的 extra 参数中,同时将requestId和当前传入的Callback存入 Native Module 全局的Map结构中。Activity 销毁时先取出requestId,再从 Map 中查找对应的Callback调用。如果查找不到对应的Callback,就说明进程已经重建,此时你可以直接发送全局事件通知 JS 侧该请求的状态,由 JS 侧补做后续处理逻辑。方案3:减少非必要的 Activity 重建(辅助优化)
可以在
AndroidManifest.xml对应 Activity 节点下添加配置:android:configChanges="orientation|keyboardHidden|screenSize"该配置可以避免配置变更(比如屏幕旋转、键盘弹出)导致的 Activity 重建,但无法解决系统内存不足杀死进程导致的重建问题,仅可作为辅助优化手段使用,不能作为核心解决方案。
避坑提醒
不要尝试通过反射、强行序列化等手段持久化 Callback 对象,这类实现不仅不符合 React Native 跨端交互的设计规范,还极易引发内存泄漏、空指针异常、Native 层崩溃等问题,稳定性极差。
内容的提问来源于stack exchange,提问作者LiuWenbin_NO.

