在我工作的地方,我们尝试以一种非标准的方式使用本机反应。我们不想将它用于视图,而只是使用它来运行java代码以允许我们使用Java,Swift / Objective-c为Android iOS和Web创建js和前端的所有业务逻辑,和Javascript分别。
我们在iOS上做了类似的事情:
NSURL *bundleURL = ...;
RCTBridgeModuleProviderBlock block = nil;
NSDictionary *launchOptions = nil;
RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:bundleURL moduleProvider:block launchOptions:nil];
我们的iOS开发人员能够创建一个RCTBridge,然后用它来与objective-c的JS代码进行通信。他计划在应用程序的生命中坚持这座桥梁。我无法在Android / Java上找到类似的东西。我确实让ReactInstanceManager像下面这样工作:
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.addPackage( searchPackage )
.setUseDeveloperSupport( BuildConfig.DEBUG )
.setInitialLifecycleState( LifecycleState.RESUMED)
.build();
mReactInstanceManager.createReactContextInBackground();
关于使用ReactInstanceManager进行连接的令人讨厌的部分是它需要一些生命周期回调,这有点使它与特定活动相关联。我想做iOS正在做的事情并创建一个桥梁,并在整个应用程序中保留多个不同活动的实例。
那么在iOS中存在类似于RCTBridge的东西吗?如果没有,那么我不应该跨多个活动共享相同的reactInstanceManager吗?
答案 0 :(得分:2)
The docs state只要将其连接到活动生命周期方法,就可以将ReactInstanceManager作为单例保存并在多个活动中使用它。
我发现这个方法存在一个问题。在Android上,如果您的活动扩展了基本的ReactNative活动,则SenderConstructor
会在调用ReactInstanceManager
时获得destroyed。
因此,如果您从onDestroy()
打开第二个活动 - 一旦返回MainActivity
,MainActivity
无效,您的单身人士基本上毫无价值。
我已经开了issue了。