建议我在Android oreo中保持socket-io连接的一些好的做法

时间:2018-02-21 06:13:08

标签: java android

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

有些人说,使用 JobIntentService

有些人说,使用 JobService

有些人说,使用 JobScheduler

有些人说,开始服务为前台服务

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:11)

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

  如果您需要提供服务,请不要每周7天,每天24小时保持联系   向没有连接的用户发送消息,发送推送消息   通过Firebase。

如果你想在后台保持连接活动,你将面临很多问题。第一个针对Oreo的是,如果您的应用处于后台(定义为"背景"在此上下文中为here),除了很短的时间外,它不会被允许运行窗户。

你绝对可以使用JobScheduler来执行定期任务,他们不会在确切的时间间隔或时间执行以减少电池使用量(这很好),但它不会帮助你保持一个活着的联系。充其量,您可以使用JobScheduler定期从您的服务器提取消息。要使用JobScheduler,您需要创建一个JobService类。

JobIntentService是支持库API 26中引入的新类。它是IntentService的替代品,它将在Android API 26+上作为JobService运行,并作为Service运行(类似于IntentService,因为它将执行代码在较旧的API上的后台线程中。在奥利奥,它的背景执行仍然有限,所以它不会帮助你保持连接活着。

使用前景Service可以真正帮助您降低进程被杀的可能性,但是,您需要显示永久通知。对于聊天应用来说,这听起来不是一个好的解决方案。

如果你仍然认为拥有24/7连接是可行的选择,你还需要考虑打盹模式。您可以要求用户将您的应用程序列入白名单,即使在打盹模式下也可以运行,但您应该有充分的理由这样做。再次,您将面对Oreo中的其他bg执行限制。

您将面临的另一个问题是其他应用。有资源管理应用程序将积极杀死bg中的其他应用程序,以减少内存和电池使用。例如,我诅咒了this one

另一个问题是由 android 创建的。当系统内存不足时,它将开始终止bg中的应用程序进程。如果我没记错的话,有一个命令可以将它们杀死,应该考虑上次使用fg和当前内存时的情况。不是最严重的问题,但仍然会发生。

然后,如果我仍然没有说服你放弃永久联系的想法,那么让我与你分享你将面临的另一个问题。一些供应商在杀死bg进程时实施极具侵略性的策略,因此他们的电池续航时间会更长。例如,小米。

最后提示,无关,但我们需要一段时间来解决这个问题,所以我要分享它。如果用户强制停止您的应用设置,则您的应用 dead (即"停止状态"),直到用户再次主动启动它,它甚至不会接收Firebase推送消息。

答案 1 :(得分:3)

如果您的服务器是在XMPP配置的,那么对您来说很容易。 实际上,没有必要始终保持套接字处于活动状态。这对电池来说非常昂贵,我确定你不想这样。

案例:您正在处理消息应用程序。

如果您的套接字损坏,则客户端将以Google FIREBASE通知的形式收到该消息。当您的客户收到firebase的通知时,只需启用套接字,您就会回到正轨。 我建议您使用XMPP的原因是因为XMPP维护了一个未传递/离线消息的队列。再次连接套接字时,只需从服务器中提取离线消息即可。

我不认为这会帮助你,但这可能为你提供另一个想法的空间。