【问题标题】:React Native: sending events from android to javascriptReact Native:将事件从 android 发送到 javascript
【发布时间】:2018-03-21 15:52:33
【问题描述】:

有文档介绍如何通过 RN 桥从 RN javascript 部件native 部件 在 android 和 ios 中进行通信。 桥接通信的生命周期还不清楚。

(来源medium

我在 android 中有一个 background 服务,需要将事件发送到我的 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 之类的错误。有没有办法在本机(android)端找出桥是否可用?

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

【问题讨论】:

  • 你需要添加一些细节和代码。这是一个非常广泛的问题,因为关于后台服务的规则对于 iOS 和 Android 来说都非常复杂。如果您的目标是 Android O 及更高版本,尤其如此。您将不得不缩小范围。
  • @MichaelCheng 真的那么广泛吗?我使用事件作为一种沟通机制,并试图找到一种方法来确保不会错过事件。不过,我添加了代码的相关部分。
  • 主要是后台服务的编码方式。 iOS 和 Android 对后台服务可以保持活动的时间有非常严格的规定,必须授予哪些权限才能保持活动,即使这样,如果调度程序认为有必要,它们也可以被终止。更复杂的是,这些规则以及应该如何完成这些规则会根据您计划支持的操作系统版本范围而改变。然后最重要的是,有一些方法可以在您的应用程序被杀死后重新启动。你如何解决所有这些用例是我要求查看代码的原因。 (...在下一条评论中继续)
  • 现在你已经展示了一些代码,我可以看到你只是在做一个基本的回调并且我假设你的服务没有做任何花哨的事情来保持本身活着或重新启动应用程序。所以很有可能你的后台服务也会被杀死。在不知道您要涵盖哪些用例的情况下,很难给出好的建议。例如,您可以尝试对其进行编码以使您的应用程序保持活动状态,或者您可以假设它会死亡并将这些事件存储在一个队列中,该队列可以保存到磁盘上进行处理而不是立即触发,等等。
  • 感谢@MichaelCheng。我的问题不在于让我的服务保持活力。而是如何确保我从 android 发送的事件实际上可以通过网桥发送。我只是想确保只要我的服务运行,我就不会丢失事件,并且只在可用的情况下使用网桥。

标签: javascript java android react-native lifecycle


【解决方案1】:

当相应的 ReactContext/CatalystInstance 已被销毁,并且您尝试从本机端执行一些 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 context绑定到你应用中的一个给定的Activity/Context,你可以通过NativeModule中的回调知道这个生命周期。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
相关资源
最近更新 更多