当app在后台时,setInterval函数没有运行

时间:2017-09-12 15:00:57

标签: javascript google-maps timer phonegap-plugins phonegap

我正在开发一个带有phonegap的简单应用程序,每30秒通过ajax调用将用户当前坐标发送到我的数据库。它工作得很好

$(document).ready(function() {
    setInterval(function() {
            SetLocationUpdates();
        }, 30000);
         });

如果应用程序位于前台,则没有问题,一切正常,但如果我使用此代码打开谷歌地图应用程序

<div><a href="geo:41.897096,27.036545">Open maps app</div>

我的应用程序在后台(我的应用程序和谷歌地图应用程序单独工作。两个应用程序同时工作),并且不再执行间隔功能。

是否可以在后台使用phonegap执行javascript代码(计时器功能)?

编辑:

我使用cordova-plugin-background-mode(https://github.com/katzer/cordova-plugin-background-mode)但它仍然不起作用。警告给出错误。这有什么问题?

document.addEventListener('deviceready', function () {

    cordova.plugins.backgroundMode.enable();
    alert(cordova.plugins.backgroundMode.isActive());
}, false);

2 个答案:

答案 0 :(得分:0)

我一直在寻找同样问题的解决方案,我想我刚刚找到了一个,虽然我还没有完全尝试过这个问题,但我还是认为我会在这里发布答案,所以你也可以尝试一下。

一种解决方案是在本机代码中设置计时器,而不是JavaScript,并且似乎有一个Cordova插件就是出于这样的目的:

https://github.com/dukhanov/cordova-background-timer

安装Cordova插件后,您可以像这样使用它(粘贴自文档):

var eventCallback = function() {
    // timer event fired
}

var successCallback = function() {
    // timer plugin configured successfully
}

var errorCallback = function(e) {
    // an error occurred
}

var settings = {
    timerInterval: 60000, // interval between ticks of the timer in milliseconds (Default: 60000)
    startOnBoot: true, // enable this to start timer after the device was restarted (Default: false)
    stopOnTerminate: true, // set to true to force stop timer in case the app is terminated (User closed the app and etc.) (Default: true)

    hours: 12, // delay timer to start at certain time (Default: -1)
    minutes: 0, // delay timer to start at certain time (Default: -1)
}

window.BackgroundTimer.onTimerEvent(eventCallback); // subscribe on timer event
// timer will start at 12:00
window.BackgroundTimer.start(successCallback, errorCallback, settings);

答案 1 :(得分:0)

如果您仍在寻找此问题的答案,或者它可以帮助其他人: 我确定您在 android 中遇到了这个问题,因此要解决此问题,您应该在将背景模式cordova 插件添加到项目后添加这段代码:

this.backgroundMode.enable();
   this.backgroundMode.on('activate').subscribe(()=>{
       this.backgroundMode.disableWebViewOptimizations(); 
});