有关于如何通过 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 中的回调了解该生命周期。
关于javascript - react native : sending events from android to javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410936/