当应用程序在后台运行时,setInterval 函数不运行

问题描述 投票:0回答:4

我正在开发一个带有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);
javascript google-maps timer phonegap-plugins phonegap
4个回答
2
投票

我正在寻找同一问题的解决方案,我想我刚刚找到了一个,虽然我还没有能够完全尝试一下,但我想无论如何我都会在这里发布答案,所以你可以尝试一下也出来了。

一种解决方案是在本机代码中设置计时器,而不是 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);

0
投票

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

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

0
投票

您的问题是后台插件不起作用,因为它仅在您切换/暂停应用程序时激活。

cordova.plugins.backgroundMode.enable();
alert(cordova.plugins.backgroundMode.isActive());

您上面的代码无法返回

isActive()
,因为应用程序在调用时不会暂停/转到后台。


0
投票

这是我在这里的答案,https://stackoverflow.com/a/78470208/6631835 .

仅适用于安卓:

如果您不想使用此插件:cordova-plugin-background 并且您有权更改您的 Android 应用程序代码。这是一个方法,最后我告诉你为什么

cordova-plugin-background
不起作用(这是我的猜测,如果你使用这个答案,必须阅读它)。

这是Android代码。

// first you need create android `jsbridge`
  webView.addJavascriptInterface(InJavaScriptLocalObj(), "android")
      @Suppress("unused")
  inner class InJavaScriptLocalObj {
/**
* @ script you want to run function in js code
  @ interval time unit is millisecond
*/
 @JavascriptInterface
 fun setInterval(script: String, interval: Long): Int {
            // TODO check need to cancel
            if (hashMap.size > 0) {
                hashMap.forEach { it.value.cancel() }
                hashMap.clear()
            }
            val jobSeek = scopeMain.launch {
                while (isActive) {
                    [email protected] {
                       //Run the script in here.
                        webView.evaluateJavascript(script),
                            object : ValueCallback<String?> {
                                override fun onReceiveValue(value: String?) {
                                    if (!value.isNullOrEmpty()){
                                
                                    }
                                }
                            })
                    }
                    delay(interval)
                }
            }
            val id = hashMap.size + 1

            hashMap[id] = jobSeek
            return id
        }

        @JavascriptInterface
        fun clearInterval(id: Int) {
            hashMap[id]?.cancel()
            hashMap.remove(id)
        }
  }

这是JS代码


android.setInterval(`interval()`)

function interval(){}

// if you use vue or other frame work,you need do this

window.interval=interval()

// My function in pineapple,so i do this
window.interval=useCounterStore().interval()

但是你需要注意:

在后台,android webview 无法更新视图,无法请求网络,只能通过本机调用来运行该功能。


为什么

cordova-plugin-background
不起作用?

你需要告诉用户设置应用程序

IgnoringBatteryOptimizations

这是一个方法https://stackoverflow.com/a/62088633/6631835

© www.soinside.com 2019 - 2024. All rights reserved.