Java 建议我一些在Android oreo中保持套接字io连接的好做法

Java 建议我一些在Android oreo中保持套接字io连接的好做法,java,android,Java,Android,Android Oreo(>25)不再鼓励后台服务。我希望即使在聊天应用程序关闭时,套接字也能保持连接。 我如何实现对android 26的新更改 有人说,使用JobIntentService 有人说,使用就业服务 有人说,使用作业调度程序 有人说,以前台服务开始服务 任何帮助都将不胜感激。我在使用聊天应用程序时遇到了完全相同的问题,所以我知道你的痛苦。我们的结论是: 如果您需要提供一个新的连接,那么您不能全天候保持连接 向没有活动连接的用户发送消息,发送推送消息 通过Firebase 如果您想

Android Oreo(>25)不再鼓励后台服务。我希望即使在聊天应用程序关闭时,套接字也能保持连接。 我如何实现对android 26的新更改

有人说,使用JobIntentService

有人说,使用就业服务

有人说,使用作业调度程序

有人说,以前台服务开始服务


任何帮助都将不胜感激。

我在使用聊天应用程序时遇到了完全相同的问题,所以我知道你的痛苦。我们的结论是:

如果您需要提供一个新的连接,那么您不能全天候保持连接 向没有活动连接的用户发送消息,发送推送消息 通过Firebase

如果您想在后台保持连接的活动状态,您将面临许多问题。第一个是针对Oreo的,如果你的应用程序是在后台(在这个上下文中“后台”的定义是)它将不被允许运行,除了小时间窗口

您完全可以使用
JobScheduler
运行定期任务,它们不会以精确的间隔或时间执行以减少电池使用量(这很好),但它不会帮助您保持连接的活力。充其量,您可以使用
JobScheduler
定期从服务器中提取消息。要使用
JobScheduler
,需要创建
JobService

JobIntentService
是支持库API 26中引入的一个新类。它是
IntentService
的替代品,它将在android API 26+上作为
JobService
运行,在旧API上作为
服务运行(与
IntentService
类似,它将在后台线程中执行代码)。在Oreo上,它的后台执行仍然是有限的,因此它不会帮助您保持连接的活力

使用前台
服务
确实可以帮助您降低进程被终止的可能性,但是,您需要显示一个永久通知。对于聊天应用来说,这听起来不是一个好的解决方案

如果你仍然认为有24/7个连接是可行的选择,你还需要考虑瞌睡模式。你可以要求用户将你的应用列为白名单,即使在打瞌睡模式下运行,但你应该有很好的理由这样做。同样,您将面临Oreo中的另一个bg执行限制

你将面临的另一个问题是其他应用程序。有一些资源管理应用程序会主动杀死bg中的其他应用程序,以减少内存和电池的使用。比如,我骂了不少

另一个问题是android造成的。当系统内存不足时,它将开始终止bg中的应用程序进程。它们被杀死的顺序是这样的,如果我没记错的话,应该考虑到上次在fg中的时间和当前的内存使用情况。这不是最糟糕的问题,但它还是发生了

那么,如果我还没有说服你放弃永久联系的想法,让我和你分享你将面临的另一个问题。一些供应商在终止bg进程时实施了非常激进的策略,因此电池寿命更长。比如小米


最后一个提示,与此无关,但我们花了一段时间才弄明白,所以我将与大家分享。如果用户强制从设置中停止应用程序,则在用户再次主动启动应用程序之前,应用程序处于死机状态(即“停止状态”),它甚至不会收到Firebase推送消息。

如果服务器配置为打开,则对您来说会很容易。 实际上,没有必要让套接字一直保持活动状态。这是非常昂贵的电池,我相信你不会想要的

案例:您正在使用消息传递应用程序

如果您的套接字断开,那么客户端将以Google通知的形式接收消息。当您的客户端收到firebase的通知时,只需启用套接字,您就可以回到正轨。 我建议您使用
XMPP
的原因是,XMPP维护一个未送达/脱机消息队列。当您的套接字再次连接时,您只需从服务器中提取脱机消息


我不认为这对你有帮助,但这可能会为你的其他想法腾出空间

谢谢你的回复。此工作流程已经完成。我想知道在Android Oreo中运行后台服务的情况。我也在寻找很久以前的这种解决方案,就像什么是应用程序,它们到底在使用什么。嗯,我对你的服务器端不太了解,但是,在向另一个设备发送消息并关闭连接时,是否有任何东西阻止您只向该设备发送推送通知?这样,用户只需再次打开应用程序,即可重新创建连接,从而可以再次以正常方式发送消息。我认为今天的首要任务是尽量避免这种持续的联系。如果有的话,无论目标API级别如何,这都不可能是健康的电池。你想在应用程序关闭时让它永久保持活力吗?我建议你重新定义你的用例。做许多消息传递应用程序做的事情:推送通知,Firebase提供这种服务