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

时间:2018-01-25 14:16:36

标签: android android-intent react-native android-activity

我正在处理本机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());
    }
}

这会引发异常

  

Caught Exception:尝试调用虚方法   “com.facebook.react.bridge.JavaScriptModule   com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class中)”   在空对象引用上

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我在生产中遇到了

    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

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

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);
        }
    });
}