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

如何在无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模块中处理回调:

  1. 修改launchMeeting方法,启动Activity并注册结果监听:
@ReactMethod
fun launchMeeting() {
  val intent = Intent(reactApplicationContext, PermissionActivity::class.java)
  intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
  reactApplicationContext.startActivityForResult(intent, 1001, null)
}
  1. 在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")
  }
}
  1. 在AppCompatActivity的通话结束逻辑中设置结果:
fun onCallEnded() {
  setResult(Activity.RESULT_OK)
  finish()
}

方案3:EventBus跨组件通信

若项目已引入EventBus,可通过事件总线实现Activity与RN模块的通信:

  1. 定义事件类:
data class CallEndedEvent(val message: String)
  1. 在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)
}
  1. 在AppCompatActivity中发送事件:
val message = "Call Ended"
EventBus.getDefault().post(CallEndedEvent(message))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:25:16