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

有人可以帮忙吗?

最佳答案

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


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


尽管目前尚不清楚,但是您可能会认为JS计时器(如setInterval)将使您的代码保持运行状态……而事实并非如此。

RN doc暗示的解决方案是实现本机服务-例如本机计时器而不是JS计时器-这基本上就是react-native-background-timer的功能...

编辑

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

07-24 16:06
查看更多