我是跟踪我的应用程序的JavaScript报告,发现的Android(和iOS)暂停一些JavaScript执行时窗口是在后台或显示器关闭一些高的离谱的加载时间。
在Android上,我发现我可以使用window.onfocus
和onblur
事件,当应用程序被切换到后台(和js的执行将很快停下来,至少对于新脚本)来检测,但我不能找到一种方法当屏幕被接通或断开来检测。 这可能吗?
(在Safari上,我除了相似的结果onfocus
和onblur
没有可靠的火。)
我是跟踪我的应用程序的JavaScript报告,发现的Android(和iOS)暂停一些JavaScript执行时窗口是在后台或显示器关闭一些高的离谱的加载时间。
在Android上,我发现我可以使用window.onfocus
和onblur
事件,当应用程序被切换到后台(和js的执行将很快停下来,至少对于新脚本)来检测,但我不能找到一种方法当屏幕被接通或断开来检测。 这可能吗?
(在Safari上,我除了相似的结果onfocus
和onblur
没有可靠的火。)
有几个选项来检查它:
使用权限API
使用focus
和blur
事件,以检测浏览器选项卡中的知名度:
window.addEventListener("focus", handleBrowserState.bind(context, true)); window.addEventListener("blur", handleBrowserState.bind(context, false)); function handleBrowserState(isActive){ // do something }
我才发现我的使用情况相当不错的解决方案:
function getTime() {
return (new Date()).getTime();
}
var lastInterval = getTime();
function intervalHeartbeat() {
var now = getTime();
var diff = now - lastInterval;
var offBy = diff - 1000; // 1000 = the 1 second delay I was expecting
lastInterval = now;
if(offBy > 100) { // don't trigger on small stutters less than 100ms
console.log('interval heartbeat - off by ' + offBy + 'ms');
}
}
setInterval(intervalHeartbeat, 1000);
当屏幕被关闭(或JS暂停由于任何原因),则下一个时间间隔被延迟,直到JS恢复执行。 在我的代码,我可以通过调整定时器offBy
量,并呼吁它好。
在快速测试,这似乎在同时在Android 4.2.2的浏览器和Safari浏览器在iOS 6.1.3很好地工作。
在这里找到了一个不错的功能:
http://rakaz.nl/2009/09/iphone-webapps-101-detecting-essential-information-about-your-iphone.html
(function() {
var timestamp = new Date().getTime();
function checkResume() {
var current = new Date().getTime();
if (current - timestamp > 4000) {
var event = document.createEvent("Events");
event.initEvent("resume", true, true);
document.dispatchEvent(event);
}
timestamp = current;
}
window.setInterval(checkResume, 1000);
})();
要对事件进行注册:
addEventListener("resume", function() {
alert('Resuming this webapp');
});
这是科尔多瓦这也激发了一致的resume
情况。
你会在你的脚本做,一旦你现在在屏幕关闭? 好吧,无论如何,你可以注入Java对象( http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String) )与该活动界面和代理你在JS世界需要的所有信息。