使用Headless JS在React Native中提供后台/前景服务

时间:2018-11-26 10:35:09

标签: javascript android react-native asynchronous setinterval

我在本机反应中使用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);
}; 

上面的代码应该以{{1​​}} ms的间隔连续打印日志消息。但是,当应用程序进入后台时,它将停止打印。再次启动该应用后,它将再次开始打印。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我的猜测是,一旦您的异步无头任务结束(从呼叫者的角度来看),您的活动就会暂停,这是what RN documentation suggests

  

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

尽管目前尚不清楚,但您可能会认为JS计时器(如setInterval可以使您的代码保持运行……它们不会。

RN文档暗含的解决方案是实现本机服务-例如,本机计时器而不是JS计时器-这基本上就是react-native-background-timer所做的...

编辑

关于前台执行,默认情况下,headlessJS任务不允许在前台执行,并且会引发错误。