Когда пользователь переключается на другое приложение или экран спит, кажется, что таймеры приостанавливаются до тех пор, пока пользователь не переключится обратно на приложение (или когда экран пробудится).
Phonegap имеет резюме событие, которое вы можете прослушивать вместо опроса состояния (а также событие пауза , если вы хотите сделать что-то до того, как оно не сфокусировано).Вы начинаете слушать его после срабатывания deviceReady.
document.addEventListener("deviceready", function () {
// do something when the app awakens
document.addEventListener('resume', function () {
// re-create a timer.
// ...
}, false);
}, false);
Я использую angular с phonegap, и у меня реализована служба, которая управляет определенным тайм-аутом для меня, но в основном вы можете создать объект, который устанавливает таймер, отменяетtimer и, что наиболее важно, обновляет таймер (update - это то, что вызывается во время события возобновления).
В угловом режиме у меня есть области действия и корневая область, к которой я могу прикрепить данные, мое время ожидания глобально, поэтому яприкрепить его к корневой области, но для целей этого примера я просто прикреплю его к объекту документа.Я не потворствую этому, потому что вам нужно применить его к некоторой области видимости или пространству имен.
var timeoutManager = function () {
return {
setTimer: function (expiresMsecs) {
document.timerData = {
timerId: setTimeout(function () {
timeoutCallback();
},
expiresMsecs),
totalDurationMsecs: expiresMsecs,
expirationDate: new Date(Date.now() += expiresMsecs)
};
},
updateTimer: function () {
if (document.timerData) {
//
// Calculate the msecs remaining so it can be used to set a new timer.
//
var timerMsecs = document.timerData.expirationDate - new Date();
//
// Kill the previous timer because a new one needs to be set or the callback
// needs to be fired.
//
this.cancelTimer();
if (timerMsecs > 0) {
this.setTimer(timerMsecs);
} else {
timeoutCallback();
}
}
},
cancelTimer: function () {
if (document.timerData && document.timerData.timerId) {
clearTimeout(document.timerData.timerId);
document.timerData = null;
}
}
};
};
Вы могли бы заставить функцию менеджера принимать параметр миллисекунды вместо того, чтобы передавать его в набор, но опять-таки этосмоделированный несколько после угловой службы, которую я написал.Операции должны быть четкими и достаточно краткими, чтобы что-то с ними сделать и добавить их в собственное приложение.
var timeoutCallback = function () { console.log('timer fired!'); };
var manager = timeoutManager();
manager.setTimer(20000);
Вы захотите обновить таймер, как только вы получите событие возобновления в слушателе событий, например, так:
// do something when the app awakens
document.addEventListener('resume', function () {
var manager = timeoutManager();
manager.updateTimer();
}, false);
Менеджер тайм-аута также имеет cancelTimer()
, который можно использовать для уничтожения таймера в любое время.