[Android] Shared ReactInstanceManager in a singleton between multiple activities failing while showing a modal
See original GitHub issueI integrated a React Native app into an existing Android app. When a native app requests a React Native view, I start a new activity with a React Native view in it. I wrapped ReactInstanceManager in a singleton class and initialize it when the Android app loads.
The problem I experience is that ReactInstanceManager cannot be shared between multiple instances of ReactNative views. For example, if I start one React Native activity and show a share sheet using the Share component, the next time I start a new activity and provide it the cached ReactInstanceManager, it will fail while trying to show a Modal. When the React Native tries to call mDialog.show it fails with android.view.WindowManager$BadTokenException: Unable to add window. It looks like it tries to attach a dialog to a non-existent activity. It has something to do with the React Themed Context I guess.
It looks like ReactInstanceManager cannot be loaded once and shared safely between multiple instances of React Native views.
If anyone can share insight on how to share ReactInstanceManager properly, I would really appreciate that. Currently I am refreshing the manager every time I close a React Native Activity, but I would like to have a single instance.
react-native -v
: 0.42.3node -v
: v6.11.0npm -v
: 5.2.0- platform: Android
Issue Analytics
- State:
- Created 6 years ago
- Comments:5 (1 by maintainers)
Top GitHub Comments
I also have the same requirement and need to have singleton pattern for ReactInstanceManager as I need to send custom events using RCTDeviceEventEmitter to react. For this I need the ReactInstanceManager which is null at the time I build it on android activities oncreate() method .
+1 In https://facebook.github.io/react-native/docs/integration-with-existing-apps.html It says:
A ReactInstanceManager can be shared by multiple activities and/or fragments. You will want to make your own ReactFragment or ReactActivity and have a singleton holder that holds a ReactInstanceManager. When you need the ReactInstanceManager (e.g., to hook up the ReactInstanceManager to the lifecycle of those Activities or Fragments) use the one provided by the singleton.
But no example