如何在无React Context的Android AppCompatActivity中获取React上下文
在独立AppCompatActivity中获取React Native Context的解决方案
问题背景
我正在为已构建完成的Android SDK开发React Native插件,通过Native Modules实现RN调用Android原生方法。现有一个独立的AppCompatActivity,需要向RN发送「通话已结束」的回调通知,已知可通过ReactContext的DeviceEventManagerModule发送事件,但当前Activity仅持有Android上下文,无法直接获取ReactContext;尝试强转Application上下文、使用需绑定View的getReactContext()方法均失败。
方案1:静态变量持有ReactApplicationContext
在你的SDKPluginModule中,将ReactApplicationContext以静态变量保存,让其他组件可以直接访问:
修改SDKPluginModule:
class SDKPluginModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { companion object { const val NAME = "CoreSDKPlugin" @JvmStatic var reactAppContext: ReactApplicationContext? = null } init { reactAppContext = reactContext } override fun getName(): String = NAME @ReactMethod fun launchMeeting() { val intent = Intent(reactApplicationContext, PermissionActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK reactApplicationContext.startActivity(intent) } // 模块销毁时清空引用,避免内存泄漏 override fun onCatalystInstanceDestroy() { super.onCatalystInstanceDestroy() reactAppContext = null } }
在AppCompatActivity中调用:
val message = "Call Ended" SDKPluginModule.reactAppContext?.let { context -> context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) ?.emit("call_ended", message) }
方案2:通过Activity结果回调传递事件
如果担心静态变量引发内存泄漏,可通过启动Activity时注册结果监听,在RN模块中处理回调:
- 修改
launchMeeting方法,启动Activity并注册结果监听:
@ReactMethod fun launchMeeting() { val intent = Intent(reactApplicationContext, PermissionActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK reactApplicationContext.startActivityForResult(intent, 1001, null) }
- 在
SDKPluginModule中重写onActivityResult:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 1001 && resultCode == Activity.RESULT_OK) { reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) ?.emit("call_ended", "Call Ended") } }
- 在
AppCompatActivity的通话结束逻辑中设置结果:
fun onCallEnded() { setResult(Activity.RESULT_OK) finish() }
方案3:EventBus跨组件通信
若项目已引入EventBus,可通过事件总线实现Activity与RN模块的通信:
- 定义事件类:
data class CallEndedEvent(val message: String)
- 在
SDKPluginModule中注册并监听事件:
override fun initialize() { super.initialize() EventBus.getDefault().register(this) } override fun onCatalystInstanceDestroy() { super.onCatalystInstanceDestroy() EventBus.getDefault().unregister(this) } @Subscribe(threadMode = ThreadMode.MAIN) fun onCallEnded(event: CallEndedEvent) { reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) ?.emit("call_ended", event.message) }
- 在
AppCompatActivity中发送事件:
val message = "Call Ended" EventBus.getDefault().post(CallEndedEvent(message))
内容的提问来源于stack exchange,提问作者Yash Ashra
相关产品推荐
相关产品推荐

