javascript - react native : sending events from android to javascript

标签 javascript java android react-native lifecycle

有关于如何通过 RN 桥从 RN javascript 部分 与 android 和 ios 中的 native 部分 进行通信的文档。不太清楚的是桥接通信的生命周期。

(来源 medium)

我在 android 中有一个后台服务,需要将事件发送到我的 RN 应用程序。这就是我从 android Service 发送事件的方式:

private RCTDeviceEventEmitter emitter() {
    return mReactContext.getJSModule(RCTDeviceEventEmitter.class);
}
private void pushPayload(String event, WritableMap payload) {
    emitter().emit(event, payload);
}
public void sendTimerEvent(long remaining) {
    WritableMap data = Arguments.createMap();
    data.putInt("remaining", (int) remaining);
    pushPayload("timeoutEvent", data);
}

在 javascript 方面,我使用以下静态代码(不在组件中,只是将代码导入到我的 index.android.js 文件中:

const subscribeForNativeEvents = (eventID, callback) => {
  const Emitter = Platform.OS === 'android' ? DeviceEventEmitter : NativeAppEventEmitter;
  Emitter.addListener(eventID, callback);
};

subscribeForNativeEvents('timeoutEvent', (event) => {
// work with event.remaining
});

即使应用程序在后台运行,我的服务也会运行。但我想确保我只在安全的情况下尝试与 javascript 端通信。

我有时会收到诸如React: Calling JS function after bridge has been destroyed 之类的错误。有没有办法在 native (android) 端找出桥接器是否可用?

这不是关于如何让后台代码保持 Activity 状态,而是要确保只要我的 native (android) 代码在运行,我就可以确保事件不会丢失。

最佳答案

当相应的 ReactContext/CatalystInstance 已经被销毁,并且您正在尝试从 native 端执行一些 JS 操作(例如发送事件、执行回调等)时,就会出现此问题。

我猜你最好的选择是使用生命周期回调,即 onHostResume、onHostDestroy ( https://facebook.github.io/react-native/docs/native-modules-android.html#listening-to-lifecycle-events ) 或者使用另一个回调 onCatalystInstanceDestroy( https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java#L51 )

只有当你知道它没有被销毁时才发送事件。

核心思想是通常 react 上下文绑定(bind)到应用程序中的给定 Activity/上下文,并且您可以通过 NativeModule 中的回调了解该生命周期。

您可以在 ( https://github.com/facebook/react-native/blob/b531612b2c917e1f2bd6bb37bf854fe51e658b36/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java#L104 ) 找到更多详细信息

关于javascript - react native : sending events from android to javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410936/

相关文章:

android - 安卓手机不root截图

Android 打瞌睡模式 - 蓝牙

external - 在 Javascript 中,是否可以将变量传递给 <script> "src"参数?

javascript - jQuery 的 $.post 二进制文件安全吗?

java - 有什么理由不使用 git-masquerading-as-cvs 作为 cvs 的升级吗?

关闭全屏 View 后的Android WebView Video,webview自动滚动

javascript - Express 表单发布请求处理中间件返回 RangeError

javascript - 在 JavaScript 中使用 Twitter Bootstrap 字形

java - 如何在Hadoop上模拟运行一些服务器?

java - 找不到字符串字段的 validator