繁体   English   中英

如何在 android 7.0 及更高版本中保持活动套接字连接?

[英]How to keep alive socket connection in android 7.0 and above?

我正在使用Socket.io库开发多人游戏。 它运作良好。 但是,在 android 7.0 及更高版本中,当我的应用程序处于后台时,系统会自动暂停所有网络工作。 (而且我必须保持我的套接字连接) 我按照此处的描述对其进行了研究。 但是,我无法理解。 所以,请为此提供解决方案。

不幸的是,这方面有一些坏消息和一些好消息。

坏的:

自 android marshmallow 及更高版本以来,就有了打瞌睡模式的概念。 如果设备放置一段时间(无法确认持续时间且谷歌未披露),设备将进入休眠模式并暂停所有网络活动。 会有很短的维护窗口,您可以在其中进行同步和其他操作。 小解决方法,不要针对 23+ api,我说小是因为我观察到这在某些手机上不起作用。 另一种可能绕过此方法的方法是将您的应用列入电池限制的白名单,但根据谷歌指南,我认为您的应用不符合该条件。

更糟糕的消息是,从 API 26 开始,当应用程序完全在后台并且没有可见组件(通知或前台服务等)时,后台服务也将完全暂停。 所以奥利奥会更糟。

好的:

您可能真的不想一直保持套接字打开。 而是选择突发同步。 我个人每 30 - 60 分钟左右运行一次作业以尝试同步。

您可以利用 JobScheduler api,它会自动处理打瞌睡模式和其他内容,您可以让它们在有互联网连接时定期运行。 在作业运行时,您可以连接到您的服务器,执行您的操作并关闭套接字。 这就是谷歌想要的,并且正在推动所有开发者朝着这个方向努力。

2021 年 4 月 19 日更新WorkManager 是处理打瞌睡模式和后台限制限制的最佳新方法。

另一种选择是让前台服务显示活动通知,该通知将通过您的套接字不断连接。 这对用户来说是可见的,这不仅会惹恼他们,因为您一直在使用他们的数据,而且还会对电池造成伤害。 另一种方法是使用作业调度程序定期调度和运行前台服务,以保持透明,同时每隔一段时间同步一次数据。 后一种方法是 WhatsApp 所做的,他们有一个工作正在运行,偶尔将所有传入消息与前台服务同步。

简而言之:

你将无法让它一直保持活力。 您可以尝试使用我目前描述和知道的一种方法来突发性地执行此操作(也许还有其他我不知道的替代方法,我已经测试过这些并且它们有效)您将不得不妥协,抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM