我有一个原生 Android 应用程序和两个独立的
ReactNative
包,当用户在本机应用程序中激活一个或另一个时,我需要加载它们。每个捆绑的 ReactNative 应用程序还使用 react-navigation/native 进行应用程序内导航,这迫使我使用 ReactActivity
作为我的基本活动和 ReactApplication
作为我的基本应用程序类。
我发现这篇文章在运行时加载多个反应本机包但它为每个单独的包使用常规活动,为每个活动实例化一个新的
ReactInstanceManager
。将 ReactApplication
作为我的基础应用程序类迫使我在应用程序本身中创建并返回一次 RN 主机:
class MyCoolApplication: Application(), ReactApplication {
private val mReactNativeHost: ReactNativeHost = object : DefaultReactNativeHost(this) {
...
override fun getBundleAssetName(): String? {
return "mycoolapp2.bundle" // I also have "mycoolapp1.bundle"
}
...
}
override fun getReactNativeHost(): ReactNativeHost {
return mReactNativeHost
}
}
基本上,我仅限于与单个捆绑包关联的单个主机。我如何支持多个 React Native 包?
我想出了以下方法,也许不是唯一的方法,但它按预期工作。基本上,这个想法是实现如下
ReactApplication
继承方法所需的,并确保它不会被使用:
@Override
public ReactNativeHost getReactNativeHost() {
throw new NotImplementedError();
}
然后,当您需要加载任何 React Native 包时,创建一个 React Native 活动,覆盖委托并在委托中处理其余部分:
class GenericReactNativeActivity: ReactActivity() {
...
override fun createReactActivityDelegate(): ReactActivityDelegate? {
return GenericReactNativeActivityDelegate(this)
}
}
class GenericReactNativeActivityDelegate(private val mActivity: ReactActivity?) :
ReactActivityDelegate(mActivity, null) {
override fun getMainComponentName(): String {
// return your main component name
}
override fun onCreate(savedInstanceState: Bundle?) {
// init as needed
}
override fun getReactNativeHost(): ReactNativeHost {
// return host which handles bundle name
}
override fun getLaunchOptions(): Bundle? {
// return your startup params
}
}