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

Dev*_*Das 8 java android

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

有人说,使用JobIntentService

有人说,使用JobService

有人说,使用JobScheduler

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

任何帮助,将不胜感激.

lel*_*man 14

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

如果您需要向没有连接的用户发送消息,请不要保持连接24/7,请通过Firebase发送推送消息.

如果你想在后台保持连接活动,你将面临很多问题.第一个针对Oreo的是,如果您的应用程序处于后台(此上下文中"背景"的定义在此处),则除了小时间窗口之外不允许运行.

你绝对可以使用JobScheduler运行周期任务,他们不会在精确的时间间隔或次数,以减少电池的使用(这是好的)被执行,但它不会帮助您保持连接活着.充其量,您可以使用JobScheduler定期从您的服务器拉取消息.为了使用JobScheduler你需要创建一个JobService类.

JobIntentService是支持库API 26中引入的新类.这是补发IntentService,它将作为一个运行JobService在Android API 26+和作为Service(类似于IntentService在这个意义上,它会在后台线程中执行代码)在旧的API.在奥利奥,它的后台执行仍然是有限的,所以它不会帮助你保持连接活着.

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

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

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

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

然后,如果我仍然没有说服你放弃永久连接的想法,那么让我与你分享你将面临的另一个问题.一些供应商在杀死bg进程时实施了非常激进的策略,因此他们的电池将持续更长时间.例如,小米.

最后提示,不相关,但我们花了一段时间才弄明白,所以我要分享它.如果用户从力站设置你的应用程序,你的应用程序是死的(即"停止状态"),直到用户主动再次启动它,它甚至不会收到火力地堡推送消息.


Den*_*nis 5

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

案例:您正在开发一个消息应用程序。

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

我认为这不会帮助您解决问题,但这可能会为您提供一些其他想法的空间。