在同一个Android应用程序中创建多个react native应用程序实例(不使用redux)

时间:2017-12-21 06:57:47

标签: android react-native react-native-android

我有一个活动,其中包含片段,并且片段内的ReactRootView中添加了React Native。我已将ReactInstanceManager添加为应用程序中的单例,并将其附加到rootview并使用startApplication()类的ReactRootView方法启动应用程序。当只有一个Activity实例存在时,一切正常。

我有一个流程,我需要启动相同活动的新实例。这次React Native应用程序确实加载了,我可以看到为第二个Activity调用了render函数,但是它更新了第一个附加活动的视图,而不是更新第二个Activity的视图。

我正在调用附加片段中ReactInstanceManager的所有生命周期方法,并且正在调用onPause()onResume()回调。我真的被困在这里,不知道该怎么做。我已经尝试创建一个ReactInstanceManager的新实例,但它也没有帮助。

这是我想要实现的流程: ReactFragment - > OtherActivity - > ReactFragment

我需要带有ReactFragment的Activity来拥有不同的实例,并在第二个实例中再次加载react应用程序,但是render()函数更新第一个实例而不是第二个实例。

实例化ReactInstanceManager

    public synchronized ReactInstanceManager getReactInstanceManager(Activity activity) {
    if (reactInstanceManager == null) {
        reactInstanceManager = ReactInstanceManager.builder()
                .setApplication(activity.getApplication())
                .setJSMainModulePath("index")
                .setJSBundleFile("index.android.bundle")
                .addPackages(Arrays.<ReactPackage>asList(
                        new FabricPackage(),
                        new MainReactPackage(),
                        new MSREventBridgePackage(),
                        new Interactable()
                ))
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
    }
    return reactInstanceManager;
}

ReactInstanceManager添加到ReactRootView类并启动应用程序:

     mReactInstanceManager = ReactApplicationManager.getInstance().getReactInstanceManager(getActivity());
     mReactRootView.startReactApplication(
            mReactInstanceManager,
            REACT_MODULE,
            null);

调用ReactInstanceManager的所有生命周期方法:

@Override
public void onResume() {
    super.onResume();
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onHostResume(getActivity(), (DefaultHardwareBackBtnHandler)getActivity());
    }
}

@Override
public void onPause() {
    super.onPause();
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onHostPause(getActivity());
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onHostDestroy(getActivity());
    }
}

0 个答案:

没有答案