Cordova/PhoneGap: setInterval() / setTimeout() 无法正常工作

Cordova/PhoneGap: setInterval() / setTimeout() not working correctly

本文关键字:常工作 工作 setTimeout setInterval Cordova PhoneGap      更新时间:2023-09-26

我用window.setInterval实现了一个简单的倒数计时器。它在我的桌面浏览器中完美运行,但在我的智能手机(Fairphone 2)上无法正常工作,因为它是PhoneGap/Cordova应用程序。根据我的检查和我在互联网上的研究,当手机进入睡眠/待机状态时,间隔/超时会中断。这就是为什么它不起作用的原因。

令人惊讶的是,当我的手机通过USB电缆连接到计算机时,间隔/超时不会中断。因此,可能是导致不良行为的节能功能。

所以,我迷路了。我不知道如何实现我的简单倒数计时器,这当然应该在手机睡眠时工作(=显示屏关闭)。有没有 window.setInterval()/window.setTimeout() 的替代方案?

这是我的简单代码(如前所述:window.setTimeout 也不起作用):

...
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/libs/jquery.js"></script>
<script>
    var min = 25;
    $(document).ready(function(){
        intervalID = window.setInterval(function () {
            --min;
            if (min > 0) {
                $("#countdown").text(min);
            }
        }, 6000);
    });
</script>
...
<p id="countdown">0m</p>

仅将间隔计时器用于更新显示。 使用系统时间来决定要显示的内容。

然后,如果在显示不可见时未调用您的间隔,则没有问题。 下次调用它时(当显示器再次打开时),它将从系统时间计算正确的经过时间,并且它将正确显示。

出于这个原因(以及其他几个原因),你永远不应该假设setInterval()会保持完美的时间。 在Javascript中,它只是意味着您希望每隔一段时间被调用一次,并且您可以设置一个大致时间来指定频率,但是间隔可能会关闭很长时间。

获取间隔从 Date.now() 开始的时间,然后每次触发间隔时,获取新的系统时间并从开始时间中减去以查看经过了多少时间,然后计算要显示的内容。

如果要显示 25 分钟计时器的剩余分钟数,可以执行以下操作:

function showTimer(selector, minutes) {
  var startTime = Date.now();
  var interval;
  function showRemaining() {
    var delta = Date.now() - startTime;     // milliseconds
    var deltaMinutes = delta / (1000 * 60);
    if (deltaMinutes < minutes) {
      // display minutes remaining
      $(selector).text(Math.round(minutes - deltaMinutes));
    } else {
      $(selector).text(0);
      clearInterval(interval);
    }
  }
  interval = setInterval(showRemaining, 15 * 1000);
  showRemaining();
}
$(document).ready(function(){
  showTimer("#countdown", 25);
});

工作演示:https://jsfiddle.net/jfriend00/807z860p/

我找到了一个 cordova 插件,即使显示屏关闭,它也会执行超时/间隔:

Cordova-plugin-timers (on github)

jfriend00的回答也很有帮助。