我正在使用 Socket.io 开发多人游戏图书馆。它运作良好。 但是,在 android 7.0 及更高版本中,当我的应用程序处于后台时,系统会自动暂停所有网络工作。 (而且我必须保持我的套接字连接)。 我按照描述对其进行了研究here . 但是,我无法理解。所以,请为此提供解决方案。
最佳答案
不幸的是,这方面有一些坏消息和一些好消息。
差:
自 android marshmallow 及更高版本以来,就有了打瞌睡模式的概念。如果设备放置一段时间(无法确认持续时间且谷歌未披露),设备将进入休眠模式并暂停所有网络 Activity 。会有很短的维护窗口,您可以在其中进行同步和其他操作。小解决方法,不要针对 23+ api,我说小是因为我观察到这在某些手机上不起作用。另一种可能绕过此方法的方法是将您的应用列入电池限制的白名单,但根据谷歌指南,我认为您的应用不符合此条件。
更糟糕的是,从 API 26 开始,当应用程序完全在后台且没有可见组件(通知或前台服务等)时,后台服务也将完全暂停。所以奥利奥会更糟。
好:
您可能真的不想一直保持套接字打开。而是选择突发同步。我个人每 30 - 60 分钟左右运行一次作业以尝试同步。
您可以利用 JobScheduler api,它会自动处理休眠模式和其他内容,您可以让它们在有互联网连接时定期运行。在作业运行时,您可以连接到您的服务器,执行您的操作并关闭套接字。这就是谷歌想要并正在插入所有开发者的目标。
2021 年 4 月 19 日更新 WorkManager 是处理打瞌睡模式和后台限制限制的最佳新方法。
另一种选择是让前台服务显示一个 Activity 通知,该通知将通过您的套接字不断连接。这对用户来说是可见的,这不仅会惹恼他们,因为您一直在使用他们的数据,而且还会对电池造成伤害。另一种方法是使用作业调度程序定期调度和运行前台服务,以保持透明,同时每隔一段时间同步一次数据。后一种方法是 WhatsApp 所做的,他们有一个工作正在运行,偶尔将所有传入的消息与前台服务同步。
简而言之:
你不可能一直让它活着。您可以尝试使用我描述和目前知道的一种方法来突发性地执行此操作(也许还有其他我不知道的替代方法,我已经测试过这些并且它们有效)您将不得不妥协,抱歉。
关于android - 如何在 android 7.0 及更高版本中保持 Activity 套接字连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016230/