即使在后台,我也试图将设备的位置设置为10或20秒的常规间隔。后台服务在android中不起作用。我已经按照链接
了https://github.com/Red-Folder/Cordova-Plugin-BackgroundService/blob/master/2.9.0/README.md
我正在使用cordova 2.9.0。 我的代码是用于后台服务
var myService = cordova.require('cordova/plugin/myService');
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
getStatus();
}
function handleSuccess(data) {
updateView(data);
}
function handleError(data) {
updateView(data);
}
function getStatus()
{
startService();
myService.getStatus(function(r){handleSuccess(r)},
function(e){handleError(e)});
};
function startService()
{
myService.startService( function(r){handleSuccess(r)},
function(e){handleError(e)});
}
function updateView(data)
{
var myVar;
if (data.ServiceRunning)
{
var options = { enableHighAccuracy: true };
myVar = setInterval(function()
{
console.log("running");
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
}, 10000);
}
else
{
clearInterval(myVar);
}
}
function stopService() {
myService.stopService(function(r){handleSuccess(r)},
function(e){handleError(e)});
}
在onSuccess方法中,我已将位置保存在文件中。 现在它在应用程序打开时工作正常但不在后台运行。
答案 0 :(得分:1)
我认为问题在于您从javascript代码调用地理位置(在函数updateView()
中)。将应用程序放在后台的那一刻,javascript代码的执行将停止(因此将调用updateView()
函数)。应用程序在后台运行时唯一有效的是您启动的服务。
所以你可能想做的是改变MyService
类的原生android代码并调用服务的doWork()
函数中的地理位置(类似于他们在这里所做的,但不是记录你将做地理位置:https://github.com/Red-Folder/Cordova-Plugin-BackgroundService/blob/master/2.9.0/MyService.java):
public class MyService extends BackgroundService {
...
@Override
protected JSONObject doWork() {
//geolocate and store the results to FTP using native java code
return result;
}
...
如果您不知道如何在Android原生代码中进行地理定位,那么这篇文章可能对您有用:Good way of getting the user's location in Android