将数据从 Android 活动发送到 React Native

tep*_*ash 4 android android-intent android-activity react-native

我正在处理原生 android 活动中的意图,并希望将在意图中获得的数据发送到反应原生部分。请原谅我糟糕的术语/解释 - 在 Android 开发方面,我是一个完整的初学者。

我曾尝试遵循本指南:https : //facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript,但我在获取主要反应上下文时遇到了困难。因此,意图来自应用程序之外,我想获取意图数据并启动应用程序。例如,主视图应该只显示来自意图的文本。

这是我发送事件的方式:

public class CustomActivity extends ReactActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WritableMap map = Arguments.createMap();
    map.putString("messageString", "CustomMessage");

    try {
      getReactInstanceManager().getCurrentReactContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("customEvent", map);
    } catch (Exception e){
      Log.e("ReactNative", "Caught Exception: " + e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这会引发异常

捕获异常:尝试在空对象引用上调用虚拟方法“com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)”

我没有为活动定义自定义布局,而是想使用主应用程序的上下文。

小智 7

我在生产中遇到了几个

    Fatal Exception: java.lang.RuntimeException
            Unable to resume activity {minibar.android/minibar.android.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference
    Caused by java.lang.NullPointerException
            Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference
Run Code Online (Sandbox Code Playgroud)

所以解决方案是检查是否reactContext为空,否则创建侦听器并等待它:

ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager();
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if(reactContext != null) {
    reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("url", params);
} else {
    reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
        @Override
        public void onReactContextInitialized(ReactContext context) {
            context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("url", params);
            reactInstanceManager.removeReactInstanceEventListener(this);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


tep*_*ash 4

所以这似乎失败了,因为上下文没有及时创建。为了解决这个问题,我添加了一个繁忙的等待来创建上下文。

while (getReactInstanceManager().getCurrentReactContext() == null);  // Busy wait.
getReactInstanceManager().getCurrentReactContext()
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    .emit("defineIntent", map);
Run Code Online (Sandbox Code Playgroud)

如果有人知道更好的处理等待的方法,请在此处更新。谢谢你!