javascript - 使用 Headless JS 响应 native 的后台/前台服务

标签 javascript android react-native asynchronous setinterval

我在 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 毫秒的间隔连续打印日志消息。但是当应用程序进入后台时,它会停止打印。当应用程序恢复时,它再次开始打印。

有人可以帮忙吗?

最佳答案

我的猜测是,一旦您的异步 headless 任务结束(从调用者的 Angular 来看),您的 Activity 就会暂停,这是 what RN documentation suggests :

You can do anything in your task such as network requests, timers and so on, as long as it doesn't touch UI. Once your task completes (i.e. the promise is resolved), React Native will go into "paused" mode (unless there are other tasks running, or there is a foreground app).

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

RN 文档暗示的解决方案是实现本地服务 - 例如本地计时器而不是 JS 计时器 - 这基本上就是 react-native-background-timer确实……

编辑

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

关于javascript - 使用 Headless JS 响应 native 的后台/前台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53479249/

相关文章:

java - 如何提高来自 Tesseract 的 OCR 文本的准确性?

Android - 自定义 SeekBar - 进度条上的圆角

android - android中的分贝

javascript - 如何在 React Native Project 中将本地文本文件加载到字符串变量中?

javascript - 延迟 javascript $(window).load

javascript - 同一事件和节点上的事件处理程序以相反的顺序运行

react-native - 在 react-native webview 中为触摸事件创建一个洞

css - react native : Modal overlaps a root component

JavaScript:计数器和 IF/Else

javascript - Backbone 从嵌套 json 获取数据