我正在处理本机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中)” 在空对象引用上
我没有为活动定义自定义布局,并且想要使用主应用程序的上下文。
答案 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);
}
});
}