如何在Android 7.0及以上版本中保持socket连接的活动状态?

9
我正在使用Socket.io库开发多人游戏,目前一切正常。但是,在Android 7.0及以上版本中,当我的应用程序处于后台时,系统会自动挂起所有网络工作。(而我必须保持我的socket连接活跃)。我已经按照这里所述进行了研究,但我无法理解。因此,请提供解决方案。
1个回答

15

不幸的是,这方面有好坏两个消息。

坏消息是,自安卓6.0及以上版本开始,引入了待机模式的概念。如果设备闲置一段时间(无法确认具体时间长度,谷歌没有公开),设备将进入待机模式并暂停所有网络活动,只会出现短暂的维护窗口用于同步等操作。一个小的解决方法是不要针对API 23及以上的版本进行开发,但实际上我发现在某些手机上这种方法不起作用。另外一个可能规避此问题的方法是将您的应用添加到电池限制白名单中,但根据Google的指南,我认为您的应用不太可能符合资格。

更糟糕的消息是,从API 26开始,当应用完全处于后台且没有显示组件时(如通知或前台服务等),后台服务也将完全被挂起。因此,Oreo版本将更加困难。

好消息是,您可能并不需要持续保持套接字连接开启。相反,可以选择进行同步突发操作。我个人每30-60分钟运行一次任务来尝试同步。

您可以使用JobScheduler API,并且它会自动处理待机模式等内容,并在有网络连接时定期运行任务。当作业正在运行时,您可以连接到服务器,处理相关操作并关闭套接字。这是谷歌想要的,并且也在向所有开发人员推广的方法。

更新-2021年4月19日 WorkManager是应对待机模式和后台限制的新方法,也是最佳方式。

另一个选择是使用前台服务,并显示活动通知,通过套接字不断连接。这将对用户可见,不仅会让他们感到恼火,而且可能对电池造成损害。另外一种方法是使用作业调度程序定期运行前台服务,以保证透明性并定期同步数据。WhatsApp就是采用这种方式,他们有一个运行中的作业,定期将所有传入消息与前台服务同步。

简而言之:

您将无法始终保持其运行。您可以尝试使用我描述并了解的方法之一进行间歇性操作(也许还有其他替代方法,但我不知道,我已经测试过这些方法并且它们有效)。您将不得不做出妥协,抱歉。


哇!!太棒了...但我不知道什么是作业调度器和那些东西。如果可能的话,请提供一些示例。 - Abhay Koradiya
1
这篇文章对我帮助很大。请注意,作业调度程序将在主UI线程上运行,因此您必须生成一个工作线程、一个异步任务或启动前台服务,正如我所说的那样。否则,在连接到网络时会出现异常。 :) 祝编码愉快...现在您有很多文章可以阅读了 :) - Kushan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接