手机锁定时Socket.io丢失连接

时间:2015-05-12 13:00:36

标签: javascript android socket.io

setInterval(function(){ 
socket.emit("stayalive", { "room": room });
}, 5000);

我有一个简单的浏览器应用程序,在我的手机上运行间隔功能。我在我的Nexus 4上使用Chrome进行调试。现在我的问题是:当我锁定手机时,大约5分钟后间隔停止,然后我的手机与套接字io服务器断开连接。

如果我没有锁定屏幕,则间隔不会停止,手机也不会断开连接。

  

12:29:10第一个间隔

     

12:34:27最后一个传入间隔

     

12:35:52客户端与服务器

断开连接

这是一个Android功能,当手机被锁定后,每隔一段时间5分钟就会被杀死或类似的东西吗?

我在我的nexus 4上运行chrome,但是其他设备的朋友也遇到了同样的问题。

1 个答案:

答案 0 :(得分:4)

每个移动设备操作系统都为移动设备的电池实施自己的保护,这包括决定各种事物可以“在后台运行”多长时间。这样做是为了防止手机应用程序太快耗尽电池。

Chrome的变体在运行间隔的频率上都有限制(即使是不在前台的Windows /标签上的Chrome限制间隔计时器的桌面版本),移动版本对可能需要的webSockets等内容也有进一步限制定期保持活动数据包以保持连接打开。听起来你已经发现Chrome选择手机锁作为时间来限制长时间运行的应用程序并防止他们使用电池。该理论可能是最终用户无法查看应用程序,如果手机被锁定,那么为了节省小型移动电池,这被认为是一个不错的权衡方案。

作为纯网页应用程序,您无法阻止浏览器“管理”您的应用程序,就像节省电池一样。如果您有本机应用程序,则可以访问其他针对长时间运行的后台通知进行了优化的OS服务(例如推送服务)。

一种可能的解决方法是确定设备/应用程序何时被唤醒并且用户再次与其进行交互,然后立即重新连接并获取您在断开连接时可能错过的所有更新。如果以自动方式执行此操作,则可能不会使用户放慢速度。如果您在手机被锁定时需要实际的背景通知,那么您可能需要在手机上使用更多原生应用功能,例如推送服务。