使用 Headless JS 进行本机反应的后台/前台服务

Posted

技术标签:

【中文标题】使用 Headless JS 进行本机反应的后台/前台服务【英文标题】:Background/Foreground service in react native using Headless JS 【发布时间】:2019-04-27 23:42:58 【问题描述】:

我在 react native 中使用 Headless JS 创建后台服务。我的要求是创建一个服务,该服务将从MainActivity 调用(例如单击按钮)并在应用程序进入后台后继续执行。我可以设法使用Headless JS 创建服务并在按钮单击时调用。为简单起见,我将用简单的代码进行解释

MyTask.js

module.exports = async () => 
    console.log("I am called from java service");
    for(var i=0; i<1000000;i++)
        console.log("I am called from for loop"+i);
    
;

使用上述代码时,即使应用程序进入后台,for 循环也会继续执行,直到 i 到达 999999 我也能够在控制台中看到日志消息。

但我的实际任务包含一些async 函数。例如,当我在任务中使用以下代码时,应用程序进入后台时无法打印

module.exports = async () => 
    console.log("I am called from java service");
    setInterval(() => 
        console.log("I am called from java service inside setInterval");
    , 100);
; 

上面的代码应该以100 ms 的间隔连续打印日志消息。但是,当应用程序进入后台时,它会停止打印。当应用程序恢复时,它再次开始打印。

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

我的猜测是,一旦你的异步无头任务结束(从调用者的角度),你的活动就会暂停,这是what RN documentation suggests:

您可以在任务中执行任何操作,例如网络请求、计时器和 依此类推,只要它不触及 UI。一旦你的任务完成(即 承诺已解决),React Native 将进入“暂停”模式 (除非有其他任务正在运行,或者有前台应用程序)。

虽然不清楚,但您可能认为 JS 计时器(例如 setInterval)会让您的代码保持运行……但不会。

RN doc 所暗示的解决方案是实现一个原生服务 - 例如一个原生计时器而不是一个 JS 计时器 - 这基本上是 react-native-background-timer 所做的......

编辑

关于前台执行,默认情况下,headlessJS 任务是不允许在前台执行的,会报错。

【讨论】:

由于实际的服务代码中包含了一系列async的方法和事件,所以无法将其转化为同步的。它也是一个在 webrtc 之上创建的自定义 js 库,用于与另一台设备进行通信。原生实现也很难实现。您还有其他可以提供帮助的建议/解决方案吗? 纯 JS 中的 Webrtc 可能无法正常工作......或者你正在使用这个:github.com/oney/react-native-webrtc?尽管如此,如果没有进一步的上下文,很难为您提供帮助:您如何设置无头任务,您如何称呼它...

以上是关于使用 Headless JS 进行本机反应的后台/前台服务的主要内容,如果未能解决你的问题,请参考以下文章

即使设备在本机反应中重新启动,如何运行后台任务?

当应用程序处于后台时,在反应本机后台计时器 setInterval 中调用 await

当应用程序处于后台状态(Android)时,远程推送通知提示无法在本机反应中工作

反应 JS 与反应本机

使用 Next.js 后端反应本机

我想从本机活动传递数据以使用 android 中的桥接来反应本机 js 文件