我在本机反应中使用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的间隔连续打印日志消息。但是,当应用程序进入后台时,它将停止打印。再次启动该应用后,它将再次开始打印。
有人可以帮忙吗?
答案 0 :(得分:0)
我的猜测是,一旦您的异步无头任务结束(从呼叫者的角度来看),您的活动就会暂停,这是what RN documentation suggests:
您可以在任务中执行任何操作,例如网络请求,计时器和 等等,只要它不涉及UI。任务完成后(即 承诺已解决),React Native将进入“已暂停”模式 (除非正在运行其他任务,或者有前台应用程序。)
尽管目前尚不清楚,但您可能会认为JS计时器(如setInterval
可以使您的代码保持运行……它们不会。
RN文档暗含的解决方案是实现本机服务-例如,本机计时器而不是JS计时器-这基本上就是react-native-background-timer所做的...
编辑
关于前台执行,默认情况下,headlessJS任务不允许在前台执行,并且会引发错误。